2

我使用的是 Windows 7 计算机,所以我定义了 WINVER 和 _WIN32_WINNT 来反映这一点。但是,当包含 windows.h 时,它看不到原始的 #define 并将值重新定义为默认的 0x0400。我的代码如下。这是在带有 mingw g++ 的 QT creator 中的 Windows 7 PC 上。关于为什么会发生这种情况的任何想法?

#define WINVER 0x0601
#define _WIN32_WINNT 0x0601

#if WINVER > 0x0600
#define GOOD
#endif

#include <windows.h>

#if WINVER > 0x0600
#define STILL_GOOD
#endif

#include <winuser.h>
#include <initguid.h>
#include <dbt.h>

编辑:我使用 #if WINVER > 0x0600... 语句来确定值是什么。

4

3 回答 3

3

定义这些常量的正确方法是在您的项目中,而不是在您的源文件中。这样,它们将作为命令行键进入编译。

这些是唯一WINVER定义的地方:

  • c:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\odbcinst.h,第 28(1) 行。
  • c:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\sdkddkver.h,第 166(2)、168(1) 行。
  • c:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\WinDef.h,第 39(1) 行。
  • c:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\WinGDI.h,第 43(1) 行。
  • c:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\WinReg.h,第 29(1) 行。
  • c:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\WinResrc.h,第 21(1) 行。
  • c:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\WinUser.h,第 39(1) 行。

这些是唯一_WIN32_WINNT定义的地方:

  • c:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\ObjBase.h,第 18(1)、22(1)、26(1)、30(1) 行。
  • c:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\ObjIdl.h,第 604(1)、607(1)、610(1)、613(1) 行。
  • c:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\sdkddkver.h,第 151(1) 行。
  • c:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\WinResrc.h,第 33(1) 行。

如您所见,定义位于#ifdef. (我没有检查所有地方)。

如果您有正确的项目、正确的 SDK 版本等,则不应覆盖您项目中的定义。

如果您的项目中的定义没有正确传播,这意味着有些事情搞砸了。很难说到底是什么。

无论如何,正确的方法是在您的项目或 makefile 中定义这些参数。

于 2012-10-10T22:41:24.617 回答
1

尝试流动的方法

#include <windows.h>

#include <winuser.h>

#ifdef WINVER
#undef WINVER
#endif

#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif

#define WINVER 0x0601
#define _WIN32_WINNT 0x0601

#include <initguid.h>
#include <dbt.h>
于 2012-10-10T22:34:41.667 回答
0

阅读其他评论表明 windows.h 不正确。您的搜索路径中有没有重复 windows.h 的机会?

于 2012-10-10T23:25:57.903 回答