1

私は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 でも発生します

4

1 に答える 1

5

これは、「System Idle Process」の PID = 0がありOpenProcess、そのような ProcessID 値で失敗するために発生します。ライブラリにパッチを適用して使用しないようにするか、ループで try/except を使用します。

于 2012-09-11T17:28:57.963 に答える