救命!错误C2040:'HWINEVENTHOOK':'DWORD'的间接级别与'HWINEVENTHOOK__ *'不同

时间:2009-03-18 06:28:51

标签: c++ windows visual-c++ sdk

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

中定义了两次HWINEVENTHOOK

WINDEF.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?我不知所措。有人帮忙吗?

2 个答案:

答案 0 :(得分:3)

根据this MSDN forum thread

  

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的项目设置中进行(对于所有构建,而不仅仅是当前构建!),或者在项目中每个模块包含的公共头文件中进行。明确地这样做会减少不同构建环境可能有不同假设的机会。