我正在使用这个名为 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/