我正在一个新的盒子(vista 64)上编译我的应用程序,现在它不再编译了。编译器在标题中给出了错误。问题似乎是(?)是在
中定义了两次HWINEVENTHOOKWINDEF.H
#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 for vista,它是0x0600,而Windows XP是0x0501,那么为什么要定义DWORD?我不知所措。有人帮忙吗?
答案 0 :(得分:3)
winable.h已从Windows移出 SDK在2005年7月因为功能 在winuser.h中重复。它是 当时确定那种努力 最好花在更新上 winuser.h到Windows Vista级别 功能而不是更新 两个文件的功能。
您使用的是什么版本的Windows SDK,以及您的代码所针对的Windows版本?可以在makefile,项目文件或头文件中指定目标Windows版本。在Vista上编译代码并不一定意味着目标版本是Vista。
另外,您是否尝试过从winable.h切换到winuser.h?
答案 1 :(得分:1)
您可能需要将WINVER显式设置为与您要定位的最低Windows版本对应的版本。我怀疑它的默认值不会高于Win2K ......
您可以使用以下快速(未经测试)的黑客检查其默认值:
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv) {
printf("WINVER=0x%04x\n", WINVER);
return 0;
}
编译为控制台应用程序并在命令提示符下运行它可能提供线索。否则,您将花费多年时间追逐包含文件,试图找出它设置默认值的位置。
编辑:通常,总是为项目指定WINVER是最安全的。可以在Visual Studio的项目设置中进行(对于所有构建,而不仅仅是当前构建!),或者在项目中每个模块包含的公共头文件中进行。明确地这样做会减少不同构建环境可能有不同假设的机会。