使用Delphi从PID获取完整路径

11

我需要从一个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;

但总是返回以下消息:

指定的模块无法找到

如何从进程 ID(PID)获取完整路径?

1个回答

23

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

Win7: 即使我以管理员身份运行它或者在OpenProcess调用中使用PROCESS_QUERY_LIMITED_INFORMATION选项,我仍然不断收到“访问被拒绝”的错误。 有任何想法为什么会这样? - Toby
@Andreas 看起来你和我同时回答了这个问题。 - user1580348
@user1580348:不,我比你早超过10年。 - Andreas Rejbrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接