delphi - TProcessInfo - 获取进程的完整路径

标签 delphi process delphi-xe2

我正在使用这个名为 TProcessInfo 的非可视开源组件获取进程列表、ProcessID 和我放入 ListView 的完整路径。

我用来执行此操作的代码:

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
  Process: TProcessItem;
begin
  for i := 0 to ProcessInfo1.RunningProcesses.Count -1 do
  begin
    Process := ProcessInfo1.RunningProcesses[i];
    with lv.Items.Add do
    begin
      Caption := Process.ExeFile;
      SubItems.Add(IntToStr(Process.ProcessID));
      SubItems.Add(Process.FullPath);
    end;
  end;
end;

代码总是会在最后一行中断:SubItems.Add(Process.FullPath); 并且我收到一条错误消息:

系统错误。代码:87
参数不正确。

组件中获取FullPath的代码为:

function TProcessItem.GetFullPath: TFileName;
var
  hProcess: THandle;
begin
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,FProcessID);
  if hProcess <> 0 then
  begin
    try
      SetLength(Result,MAX_PATH);
      FillChar(Result[1],Length(Result) * SizeOf(Char), 0);
      if GetModuleFileNameEx(hProcess,0,PChar(Result),Length(Result)) > 0 then
        Result := Trim(Result)
      else
       RaiseLastOSError;
    finally
      CloseHandle(hProcess)
    end;
  end
  else
    RaiseLastOSError;
end;

如果像错误状态一样 - 参数不正确,那么我该如何更改它?

** 该组件使用 PsAPI,我在 Windows 7 Ultimate x64 上使用 Delphi XE2,在 Windows XP Pro x86 上也会发生这种情况

最佳答案

发生这种情况是因为“系统空闲进程”的 PID = 0,并且 OpenProcess 因这样的 ProcessID 值而失败。修补库以避免在循环中使用它或使用 try/except 。

关于delphi - TProcessInfo - 获取进程的完整路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12374432/

相关文章:

delphi - 从资源流加载图标时出现奇怪的 AV

.net - SOAP 不一致? Delphi 2010 (Win32) 服务器和 .NET 客户端交换 'out-parameter' 和 'result'

command-line - 参数传递策略 - 环境变量与命令行

android - 不同应用程序调用时 "Generating New Processes"出现问题?

macos - Delphi XE2 在 Mac 上可以播放 WAV 声音吗?

delphi - 连接关闭后如何释放DataSnap内存?

delphi - 如何将字符串拆分为固定长度子字符串数组?

Delphi:可维护性虚拟与虚拟抽象

javascript - Node 中的奇数执行输出

delphi - 当我的窗体大于屏幕时,为什么我的 Delphi 窗体控件会被裁剪?