【问题标题】:Help! error C2040: 'HWINEVENTHOOK' : 'DWORD' differs in levels of indirection from 'HWINEVENTHOOK__ *'帮助!错误 C2040:“HWINEVENTHOOK”:“DWORD”与“HWINEVENTHOOK__ *”的间接级别不同
【发布时间】:2009-03-18 06:28:51
【问题描述】:

我正在一个新盒子 (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 中查找 vista,它是 0x0600,而 windows XP 是 0x0501,那么为什么要定义 DWORD?我不知所措。有人帮忙吗?

【问题讨论】:

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


    【解决方案1】:

    根据this MSDN forum thread

    winable.h 已从 Windows 移出 SDK 在 2005 年 7 月,因为功能 在 winuser.h 中重复。它是 当时决定努力 最好花在更新上 winuser.h 到 Windows Vista 级别 功能而不是更新 两个文件的功能。

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

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

    【讨论】:

    • 好的,切换到 winuser.h 解决了。我想我两者都包括在内。谢谢。您的帮助非常宝贵。我很感激。
    【解决方案2】:

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

    【讨论】:

    • ...并确保将其设置为项目的相同值,而不仅仅是某些文件!
    猜你喜欢
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多