You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MinGW编译C++代码时GetProcessImageFileName未定义引用错误原因

通过PID获取可执行文件路径编译报错:GetProcessImageFileName未声明

问题背景

使用g++ (MinGW.org GCC-6.3.0-1)编译代码时出现以下错误:

..\src\Test.cpp:15:61: error: 'GetProcessImageFileName' was not declared in this scope

待编译代码

#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <process.h>
#include <string>
#include <iostream>

using namespace std;
string getProcessName(unsigned long pid)
{
    string name = "";
    TCHAR processPath[MAX_PATH] = { 0 };
    DWORD len = MAX_PATH;
    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid );
    int rc = GetProcessImageFileName(hProcess, processPath, len);
    if(rc > 0)
    {
//      GET STRING HERE
    }
    CloseHandle(hProcess);
    return name;
}

错误原因

  1. 缺少PSAPI头文件
    GetProcessImageFileName属于Windows的Process Status API(PSAPI),你使用的旧版MinGW中,该函数的声明并未包含在默认的windows.h里,必须显式引入psapi.h才能让编译器识别。

  2. 宏定义生效逻辑问题
    虽然你定义了_WIN32_WINNT 0x0501,但该宏需要在所有Windows相关头文件之前定义才能触发GetProcessImageFileName的条件编译声明,若顺序不对也会导致函数未被识别。

  3. 未链接PSAPI库
    即便解决了编译声明问题,后续链接阶段还需要关联psapi库,否则会出现链接错误。

解决方法

步骤1:修改代码

添加psapi.h头文件,确保宏定义顺序正确,并增加句柄有效性检查:

#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <psapi.h>  // 新增:引入PSAPI头文件
#include <process.h>
#include <string>
#include <iostream>

using namespace std;
string getProcessName(unsigned long pid)
{
    string name = "";
    TCHAR processPath[MAX_PATH] = { 0 };
    DWORD len = MAX_PATH;
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
    if (hProcess != NULL) {  // 新增:检查句柄是否有效,避免空指针调用
        DWORD rc = GetProcessImageFileName(hProcess, processPath, len);
        if (rc > 0)
        {
            // 根据字符集转换路径到string
            #ifdef UNICODE
            char buffer[MAX_PATH];
            WideCharToMultiByte(CP_ACP, 0, processPath, -1, buffer, MAX_PATH, NULL, NULL);
            name = buffer;
            #else
            name = processPath;
            #endif
        }
        CloseHandle(hProcess);
    }
    return name;
}

步骤2:编译时链接库

使用以下命令编译代码,确保链接psapi库:

g++ Test.cpp -o Test.exe -lpsapi

内容的提问来源于stack exchange,提问作者joseph lake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:13:33