使用delphi从PID获取完整路径

时间:2010-11-14 16:33:39

标签: delphi delphi-xe

我需要从PID中获取完整路径。

我已经检查了这个问题C++ Windows - How to get process path from its 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中获取完整路径?

1 个答案:

答案 0 :(得分:17)

您需要使用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;