我将TProcessItem结构作为函数的返回值传递。在GetProcessFromHandle函数中,FindByID返回的结构的ExeFile属性包含期望的可执行文件名,但在GetProcessFromHandle返回的结构中,它以某种方式变为空。我添加了两个Messagebox来演示它。有人能够解释这里发生了什么吗?
c(1,2,3) %in% c(1,3,2)
[1] TRUE TRUE TRUE
答案 0 :(得分:6)
TProcessInfo
对象拥有TProcessItem
对象,GetProcessFromHandle()
正在返回指针。因此,当释放TProcessInfo
对象时,TProcessItem
对象也是如此,因此Test()
使用的指针无效。所以你遇到了未定义的行为。你很幸运,你的代码不仅仅是崩溃了。
如果要返回EXE文件的路径,请仅返回该值,例如:
function GetProcessExeFileFromHandle(hWnd: HWND): string;
var
ProcessInfo: TProcessInfo;
ProcessItem: TProcessItem;
PID: DWORD;
begin
Result := '';
GetWindowThreadProcessId(hWnd, @PID);
ProcessInfo := TProcessInfo.Create(nil);
try
ProcessItem := ProcessInfo.RunningProcesses.FindByID(PID);
if Assigned(ProcessItem) then
Result := ProcessItem.ExeFile;
finally
ProcessInfo.Free;
end;
end;
procedure Test;
var
ProcessExeFile: string;
begin
ProcessExeFile := GetProcessExeFileFromHandle(FindWindow(nil, 'My App'));
ShowMessage(ProcessExeFile);
end;