11

PIDからフルパスを取得する必要があります。

私はこの質問をチェックしましたC++Windows-そのPIDからプロセスパスを取得する方法 と私は次のコードを書きました:

 function GetFullPathFromPID(PID: DWORD): string;
 var
    hProcess: THandle;
    ModName : Array[0..MAX_PATH + 1] of Char;
 begin
   Result:='';
    hProcess := OpenProcess(PROCESS_ALL_ACCESS,False, PID);
    try
      if hProcess <> 0 then
       if GetModuleFileName(hProcess, ModName, Sizeof(ModName))<>0 then
         Result:=ModName
        else
         ShowMessage(SysErrorMessage(GetLastError));
    finally
     CloseHandle(hProcess);
    end;
 end;

ただし、常に次のメッセージを返します。

指定されたモジュールが見つかりませんでした

PIDからフルパスを取得するにはどうすればよいですか?

4

1 に答える 1

22

関数を使用する必要がありGetModuleFileNameExます。MSDNから:

GetModuleFileName関数

指定されたモジュールを含むファイルの完全修飾パスを取得します。モジュールは、現在のプロセスによってロードされている必要があります。

別のプロセスによってロードされたモジュールのファイルを見つけるには、GetModuleFileNameEx関数を使用します。

使用例(uses PsAPI):

function GetPathFromPID(const PID: cardinal): string;
var
  hProcess: THandle;
  path: array[0..MAX_PATH - 1] of char;
begin
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID);
  if hProcess <> 0 then
    try
      if GetModuleFileNameEx(hProcess, 0, path, MAX_PATH) = 0 then
        RaiseLastOSError;
      result := path;
    finally
      CloseHandle(hProcess)
    end
  else
    RaiseLastOSError;
end;
于 2010-11-14T17:01:01.530 に答える