我在 Windows 7 Ultimate 32 位上使用 DevC++,并在我的程序中包含 windows.h 和 psapi.h。除了 GetProcessId 和 DebugActiveProcessStop 之外,我目前使用的所有 Windows API 都可以正常工作。在这两种情况下,编译器都会返回未声明指定函数的情况。但是,当我查看 winbase.h 时,我可以清楚地看到声明了 GetProcessId。即使将鼠标悬停在函数上,也会显示有关结构的信息。那么,为什么编译器似乎不能识别这两个函数呢?
2 回答
使用 Win32 API 标头时,您需要指定目标操作系统的版本。这记录在MSDN 库中。
现在,您应该通过定义 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 库文档说明了它是在哪个版本的操作系统中引入的。
当您在 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
这应该可以解决您的问题。祝你好运^_^