大佬教程收集整理的这篇文章主要介绍了delphi – 如何避免Free内部函数破坏函数结果?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
function PAIsmainAppWindow(Wnd: THandlE): Boolean; var ParentWnd: THandle; ExStyle: DWORD; begin if IsWindowVisible(Wnd) then begin ParentWnd := THandle(GetWindowLongPtr(Wnd,GWLP_HWNDPARENT)); ExStyle := GetWindowLongPtr(Wnd,GWL_EXSTYLE); Result := ((ParentWnd = 0) or (ParentWnd = GetDesktopWindow)) and ((ExStyle and WS_EX_TOOLWINDOW = 0) or (ExStyle and WS_EX_APPWINDOW <> 0)); end else Result := false; end; function PAEnumTaskWindowsProc(Wnd: THandle; List: TStrings): Boolean; stdcall; var Caption: array [0..1024] of Char; begin if PAIsmainAppWindow(Wnd) and (GetWindowText(Wnd,Caption,SizeOf(Caption)) > 0) then List.AddObject(ExtractFilename(GetProcessNameFromWnd(Wnd)),Pointer(Wnd)); Result := True; end; function PAGetTaskWindowHandleFromProcess(const AProcessName: String): THandle; var sl: TStringList; i: Integer; begin Result := 0; sl := TStringList.Create(true); // Stringlist owns objects try if EnumWindows(@PAEnumTaskWindowsProc,LPARAM(sl)) then begin for i := 0 to sl.Count - 1 do begin if SameText(AProcessName,sl[i]) then begin Result := THandle(sl.objects[i]); BREAK; end; end; end; finally sl.Free; // AV! end; end; ChromeHandle := PAGetTaskWindowHandleFromProcess('chrome.exe');
您没有这些窗口句柄,因此您不应该尝试销毁它们.
因此,不要将OwnsObjects设置为True,问题就会消失.那就是取代这一行:
sl := TStringList.Create(true); // Stringlist owns objects
有了这个:
sl := TStringList.Create;
此外,您正在将这些对象转换为THandle.这是错误的,而不是它确实重要.从语义上讲,这些是窗口句柄,因此将它们转换为HWND.事实上,无论你在哪里使用THandle,你都应该使用HWND.
还有其他错误.当您调用使用GetWindowText时,您传递缓冲区的大小而不是其长度.这意味着你在说缓冲区有多长.因为它们是宽字符,所以缓冲区的长度是您声称的长度的一半.寻找桌面窗口的窗户感觉不对.
让我们假设,为了参数,你的字符串列表确实包含了对象.在这种情况下,并且在理想的世界中,字符串列表类将提供Extract方法,该方法是在不破坏该对象的情况下从拥有容器中移除对象的传统方法.因此,您可以执行OwnsObjects shuffle.
if SameText(AProcessName,sl[i]) then begin sl.ownsObjects := false; Result := TSomeObject(sl.objects[i]); sl.objects[i] := nil; sl.ownsObjects := True; BREAK; end;
如果您愿意,可以在创建字符串列表时将OwnsObjects设置为false,并且只在将Free设置为Free之前将其设置为True.
以上是大佬教程为你收集整理的delphi – 如何避免Free内部函数破坏函数结果?全部内容,希望文章能够帮你解决delphi – 如何避免Free内部函数破坏函数结果?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。