2012-10-10 63 views
2

我正在使用Windows 7計算機,所以我已經定義了WINVER和_WIN32_WINNT來反映這一點。但是,當包含windows.h時,它不會看到原始的#define並將值重新定義爲默認值0x0400。我的代碼如下。這是使用mingw g ++在QT創建者的Windows 7 PC上。任何想法爲什麼發生這種情況?#define變量在windows.h中被忽略和重新定義

#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 ...語句來確定值是什麼。

+0

windows.h包含winuser.h。你不應該自己包括它。 – chris

+1

你如何確定默認值爲0x400? – bobestm

+0

它看起來好像你有一個過時的SDK版本; V7.0A只將WINVER定義爲0x500或更高。您所描述的問題不會發生在v7.0A中,或者至少,我無法再現它。 –

回答

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> 
+0

我試過這樣的事情。問題是WINVER在initguid.h和dbt.h中也被忽略,我需要它來知道我正在使用Windows 7. – giroy

3

定義這些常數正確的方法是在你的項目,而不是在你的源文件。這樣他們將作爲命令行鍵進行編譯。

這些都是在WINVER定義的唯一地方:

  • C:\ Program Files文件\微軟的SDK \的Windows \ v6.0A \包含\ 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文件\微軟的SDK \的Windows \ v6.0A \包含\ OBJBASE.H,線路18(1) 22(1),26(1),30(1)。
  • C:\ Program Files文件\微軟的SDK \的Windows \ v6.0A \包含\ 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中定義這些參數。

+0

我已經嘗試在QT項目文件中定義它,以便在編譯期間將它包含爲-DWINVER = 0x601。雖然 – giroy

+0

的結果相同,但在#ifdef下是正確的。問題是,出於某種原因,在我的代碼中,我的#defined WINVER在windows.h中看不到,因此它再次被定義,儘管這不會顯示爲編譯器警告。 – giroy

+0

嘗試檢查您的命令行以確保密鑰在那裏.. –

0

閱讀其他意見,它表明windows.h是不正確的。你的搜索路徑中有沒有重複的windows.h的機會?

+0

Windows.h是正確的。有一個部分定義了WINVER,如果它是未定義的。我不明白的是爲什麼它沒有看到我的#define ... – giroy

+0

首先保存標題,然後嘗試在這裏和那裏放置'#error'。這會告訴你什麼是使用/未使用。 –