找不到Win32 API函数

时间:2012-03-10 01:38:43

标签: c++ windows dev-c++

我在Windows 7旗舰版32位上使用DevC ++,并在我的程序中包含了windows.h和psapi.h。到目前为止,我使用的所有Windows API都在工作,除了GetProcessId和DebugActiveProcessStop。在两种情况下,编译器都返回指定的函数未声明的函数。但是,当我查看winbase.h时,我可以清楚地看到声明了GetProcessId。即使我将鼠标悬停在该功能上,也会显示有关该结构的信息。那么,为什么编译器似乎无法识别这两种函数呢?

2 个答案:

答案 0 :(得分:2)

使用Win32 API标头时,您需要指定要定位的操作系统版本。这在MSDN library

中有记录

如今,你应该通过定义NTDDI_VERSION来做到这一点。如果您查看GetProcessId的文档,您会注意到它需要Windows XP SP1,因此您需要至少指定NTDDI_WINXPSP1作为目标操作系统版本。事实上,由于不再支持SP1,因此最好使用SP2:

#define NTDDI_VERSION 0x05010200

在过去,我发现定义NTDDI_VERSION并不总是按预期工作,但希望大多数故障现在已经解决了。如果它不起作用,请尝试使用较旧的宏_WIN32_WINNT,这也在上面给出的链接中记录。在这种情况下,您需要:

#define _WIN32_WINNT 0x0502

如果您以后需要使用在Vista或Windows 7中引入的功能,请相应地更改NTDDI_VERSION或_WIN32_WINNT的值。每个函数的MSDN库文档说明了它所引入的操作系统版本。

答案 1 :(得分:1)

当您在windows api中编码时,有时会弹出此问题。您可以看到该函数位于头文件中,但由于某种原因,您的编译器不同意。当您遇到此问题时,请在头文件中找到该函数,并查找它周围的预处理器指令。您可能需要定义某些内容才能使用该功能。

在这种情况下,这是我找到的您遇到问题的功能:

    #if (_WIN32_WINNT >= 0x0501)
    WINBASEAPI DWORD WINAPI GetProcessId(HANDLE);
    #endif

    #if (_WIN32_WINNT >= 0x0501)
    WINBASEAPI BOOL WINAPI DebugActiveProcessStop(DWORD);
    #endif

因此,在包含windows标题的主代码文件中,在包含windows标题之前放置此定义:

 #define _WIN32_WINNT 0x0501

这应该可以解决您的问题。祝你好运^ _ ^