在我們的預(yù)編譯頭文件stdafx.h(或者targetver.h)中,需要定義我們的開發(fā)的程序目標(biāo)Windows版本(一般是最低支持版本),看到WINVER、_WIN32_WINDOWS、_WIN32_WINNT、NTDDI_VERSION這么多版本相關(guān)宏,是不是覺得頭大,雖然簡單的全部配置成同個版本就行了,但是你知道這些宏有什么不同,為什么會這樣嗎?
歷史淵源(來自The Old New Thing)
Windows是一個持續(xù)發(fā)展中的系統(tǒng),經(jīng)過這么幾十年的時間,從16位到32位到64位,經(jīng)過了不知道多少個版本,為了保持兼容性,再版本不停的升級變化中,自然就引入了這么多個宏。
如WINVER這個宏的歷史可以追溯到16位的windows,當(dāng)時用于做頭文件的版本控制;后來windows NT出現(xiàn)了,因而又引入了_WIN32_WINNT來隔離開NT相關(guān)的特性;再后來win95出現(xiàn)了,這時又引入了_WIN32_WINDOWS來控制哪些win95引入的特性;
上述三個宏在后續(xù)的windows開發(fā)中就這么一直存在了下來,到現(xiàn)在來說WINVER還是在很多的windows頭文件中出現(xiàn),_WIN32_WINDOWS由于從xp開始,windows都使用nt內(nèi)核,就很少用了,_WIN32_WINNT這個宏現(xiàn)在還是在大量使用的。
到了Vista的時代,windows的開發(fā)人員也覺得是時候要終結(jié)一下這種亂象了,于是sdk組和ddk組的人一起合作,引入了NTDDI_VERSION這個宏(sdkddkver.h),只要單獨(dú)定義NTDDI_VERSION這個宏即可。
但是這里有個前提,就是需要你的程序面向的是Vista以上的版本;如果你還要支持到XP,那么還必須再定義_WIN32_WINNT這個宏。這是因為如果只定義NTDDI_VERSION這個宏而不定義_WIN32_WINNT的話,在sdkddkver.h中可以到,_WIN32_WINNT會被默認(rèn)定義為Vista的版本。(其他兩個宏是保持和_WIN32_WINNT一致)
總結(jié)
用VS2008創(chuàng)建工程的時候,會自動幫我們創(chuàng)建targetver.h頭文件,我們只需要在這里定義windows相關(guān)的版本宏即可。
假如你的程序需要支持的最低windows版本是xp,那就定義_WIN32_WINNT和NTDDI_VERSION;
假如你的程序最低支持的windows版本是vista,那只定義NTDDI_VERSIN即可。
另外,sdkddkver.h已經(jīng)幫我們定義好了各個windows發(fā)行版本對應(yīng)的版本號,我們直接用這些宏就更加直觀了。