GCC (MinGW)链接器在尝试使用GetProcessImageFileName时失败

4
我正在尝试使用"GetProcessImageFileName"获取远程进程的名称。然而,GCC(MinGW)链接器出现以下错误:
<source_file>.c: In function '<function_name>':
 warning: implicit declaration of function 'GetProcessImageFileName' [-Wimplicit-function-declaration]
 GetProcessImageFileName(hProcess, szProcessName, MAX_PATH);
 ^
undefined reference to `GetProcessImageFileName'
collect2.exe: error: ld returned 1 exit status

我尝试使用“-lPsapi”和“-lKernel32”进行编译,但结果相同。“GetProcessImageFileName”在“Psapi.h”中声明。

我在Windows 7 Professional 64位机器上使用GCC 4.8.1。有什么想法吗?


我能想到的唯一可能是,你在Unicode版本的函数中传递了一个“窄”字符串。你是否定义了UNICODE,并且szProcessName的类型是什么?我猜测是“是”,并且是char*std::string。如果有源代码就更好了。 - icabod
警告来自编译器而非链接器,这意味着GetProcessImageFileName未被声明。因此,您需要包含正确的头文件。如果该函数不在头文件中,则可能需要更高版本的mingw,或者需要更新mingw本身。 - arx
@arx Vanilla MinGW 缺乏 XP 中的许多新功能,例如 GetProcessImageFileName()。如果 XerZetZip 正在使用它,他需要切换到 mingw-w64。令人遗憾的是,今天我们仍然存在这样的问题,即人们使用错误的 MinGW... - andlabs
@andlabs 谢谢,我已经将其扩展为一个答案。 - arx
@icabod szProcessName是一个char数组。 - XerZetZip
@andlabs 我在命令行中包含了正确的头文件psapi.h以及-lpsapi-lKernel32。我尝试着让MinGW保持最新状态,但是似乎没有新的发展。我还尝试获取MinGW-w64,但是遇到了很多问题导致无法正常工作。 - XerZetZip
1个回答

2
请确保将宏 _WIN32_WINNT 定义为 大于或等于 0x0501(支持 Windows XP,最小系统支持 GetProcessImageFileName)。可以使用开关 -D_WIN32_WINNT=0x0501 或在包含头文件之前定义该宏。
#define _WIN32_WINNT 0x0501
#include <Windows.h>
#include <Psapi.h>

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