简单的Delphi代码中的奇怪行为

时间:2017-03-06 22:58:22

标签: delphi

我将TProcessItem结构作为函数的返回值传递。在GetProcessFromHandle函数中,FindByID返回的结构的ExeFile属性包含期望的可执行文件名,但在GetProcessFromHandle返回的结构中,它以某种方式变为空。我添加了两个Messagebox来演示它。有人能够解释这里发生了什么吗?

c(1,2,3) %in% c(1,3,2)
[1]  TRUE TRUE TRUE

enter image description here

1 个答案:

答案 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;