1

这与在 Windows 7 上运行时 Dev-C++ 附带的编译器“TDM-GCC 4.9.2 64-bit Release”有关。同样的事情也发生在 64 位版本上。“编译器选项”中的“调用链接器时添加以下标志”设置为-static-libgcc -lws2_32,“调用编译器时添加以下标志”为std=c++11

不幸的是,我无法获得比这更多的信息,因为这是一台非常非常锁定的计算机。

回到家后,我会在那里进行测试并编辑任何新信息。

一个测试文件:

#include <windows.h>
#include <psapi.h>
#include <iostream>

int main() {
    HANDLE h = GetCurrentProcess();
    TCHAR name[100];
    GetProcessImageFileName(h, name, 100);
    std::cout << "Name is " << std::endl;
}

编译时,它给出以下错误:

C:\Users\[REDACTED]\AppData\Local\Temp\ccQz3L9P.o:test.cpp:(.text+0x2f): undefined reference to `GetProcessImageFileNameA'

据我所知,它调用GetProcessImageFileNameA而不是GetProcessImageFileName因为 a #definein psapi.h

#define GetProcessImageFileName __MINGW_NAME_AW(GetProcessImageFileName)

__MINGW_NAME_AW(func)#defined in _mingw_unicode.has func##A,如果我理解正确的话,这就是新方法名称的来源。

Back in psapi.h,DWORD WINAPI GetProcessImageFileNameA(HANDLE, LPSTR, DWORD);已声明,但我在任何地方都没有找到它的定义,Dev-C++ 也不能。我相当肯定这就是问题所在。

我该如何解决?我对任何事情都持开放态度,包括切换编译器或 IDE,只要我可以将我使用的任何东西放在闪存驱动器上并尽可能少地携带它,并且最终结果不需要管理员运行权限。

4

2 回答 2

2

GetProcessImageFileName是一个 Windows API 函数,您需要链接到正确的库才能访问它。

它被定义为一个宏,GetProcessImageFileNameA或者GetProcessImageFileNameW取决于您是在编译“宽”还是“窄”。

Win32 API 具有每个函数的 Unicode 和 ascii 版本(至少是接受字符串的函数)。通常,ascii 版本将字符转换为 Unicode,并在内部调用其他植入。

于 2015-10-15T17:31:43.990 回答
1

您需要链接Psapi.libKernel32.lib进入您的项目。我不确定您的编译器,但在 VC++ 中,您可以添加#pragma comment(lib, "Psapi.Lib")到代码Psapi.lib中或添加其他项目属性库。

山姆

于 2015-10-15T17:31:00.963 回答