1

我正在一个新盒子(vista 64)上编译我的应用程序,现在它不再编译了。编译器给了我标题中的错误。问题似乎(?)是 HWINEVENTHOOK 在

文件名

#if(WINVER >= 0x0400)
DECLARE_HANDLE(HWINEVENTHOOK);
#endif /* WINVER >= 0x0400 */

然后在 winable.h 中

#if WINVER < 0x0500 // these structures and functions
                    // are in NT 5.00 and above winuser.h
typedef DWORD   HWINEVENTHOOK;

但是,我只是在 WINVER 中查找 vista,它是 0x0600,而 windows XP 是 0x0501,那么为什么要定义 DWORD?我不知所措。有人帮忙吗?

4

2 回答 2

3

根据这个 MSDN 论坛主题

winable.h 于 2005 年 7 月从 Windows SDK 中移出,因为 winuser.h 中的功能重复。当时确定将 winuser.h 更新为 Windows Vista 级别的功能而不是更新这两个文件的功能会更好。

您使用的是什么版本的 Windows SDK,以及您的代码目标是什么 Windows 版本?目标 Windows 版本可以在生成文件、项目文件或头文件中指定。在 Vista 上编译代码并不一定意味着目标版本是 Vista。

另外,您是否尝试过从 winable.h 切换到 winuser.h?

于 2009-03-18T06:57:54.867 回答
1

您可能需要将 WINVER 显式设置为与您所针对的 Windows 的最低版本相对应的版本。我怀疑它的默认值在Win2K之上并不多...

您可以通过快速(未经测试)的 hack 来检查其默认值,如下所示:

#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv) {
    printf("WINVER=0x%04x\n", WINVER);
    return 0;
}

编译为控制台应用程序并在命令提示符下运行它可能会提供线索。否则,您将花费很长时间来寻找包含文件,试图确定它在哪里设置了默认值。

编辑:通常,始终为项目指定 WINVER 是最安全的。在 Visual Studio 的项目设置中执行此操作(并且对于所有构建,而不仅仅是当前构建!),或者在项目中每个模块包含的公共头文件中执行此操作。明确地这样做将减少不同构建环境可能有不同假设的机会。

于 2009-03-18T07:52:03.957 回答