【问题标题】:C++ Windows - How to get process path from its PID (error)C++ Windows - 如何从其 PID 获取进程路径(错误)
【发布时间】:2018-07-29 05:24:51
【问题描述】:

我想用pid来获取进程的完整路径。

#include <psapi.h>

HANDLE processHandle = NULL;
TCHAR filename[MAX_PATH];

processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, nPID);
if (processHandle != NULL) 
{
    if (GetModuleFileNameEx(processHandle, NULL, filename, MAX_PATH) == 0) 
    {
        //fail to get module file name
    } 
    else 
    {
        //module file name : filename
    }
    CloseHandle(processHandle);
} 
else 
{
    //fail to open process
}

这是使用pid获取进程路径的代码。

但是,当我执行它时,出现以下错误。

(我使用的是visual c ++ 6.0。)

Linking...
Process01Dlg.obj : error LNK2001: unresolved external symbol _GetModuleFileNameExA@16
Debug/Process01.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
  • QueryFullProcessImageName
  • GetModuleFileName
  • GetModuleFileNameEx
  • GetProcessImageFileName

以上所有方法都导致了错误。

这是版本问题吗?

请回答。谢谢你:)

【问题讨论】:

标签: c++ windows process path psapi


【解决方案1】:

您似乎忘记将您的产品与psapi.lib 关联。将其添加到项目依赖项中。

不确定它是否适用于 VC6.0。

但是 MSDN 推荐了其他用于检索进程名称的函数:

要检索远程进程的主要可执行模块的名称,请使用 GetProcessImageFileNameQueryFullProcessImageName 函数。这比使用 NULL 模块句柄调用 GetModuleFileNameEx 函数更有效、更可靠。

【讨论】:

  • 添加#pragma comment (lib, "psapi.lib")解决了谢谢~
  • @areum, QueryFullProcessImageName 应该在 Vista 和更高版本中使用。它只需要对目标进程的有限访问。请注意,作为一个不可靠的实现细节,我看到在 Windows 10 中 GetModuleFileNameEx 也只需要在 hModuleNULL 时进行有限访问。对于这种情况,它的实现与QueryFullProcessImageName 相同,通过调用NtQueryInformationProcess 来获取ProcessImageFileNameWin32。当然,您应该假设GetModuleFileNameEx 需要完全访问权限才能读取目标进程中的虚拟内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 2012-12-31
  • 2013-04-21
  • 2014-04-12
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多