2

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

4

2 回答 2

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 库文档说明了它是在哪个版本的操作系统中引入的。

于 2012-03-10T04:23:04.353 回答
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

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

于 2012-03-10T02:15:14.197 回答