在我們的預(yù)編譯頭文件stdafx.h(或者targetver.h)中,需要定義我們的開發(fā)的程序目標(biāo)Windows版本(一般是最低支持版本)臼婆,看到WINVER窍霞、_WIN32_WINDOWS沦补、_WIN32_WINNT罩缴、NTDDI_VERSION這么多版本相關(guān)宏踢俄,是不是覺得頭大缩功,雖然簡單的全部配置成同個(gè)版本就行了,但是你知道這些宏有什么不同都办,為什么會這樣嗎嫡锌?
歷史淵源(來自The Old New Thing)
Windows是一個(gè)持續(xù)發(fā)展中的系統(tǒng),經(jīng)過這么幾十年的時(shí)間琳钉,從16位到32位到64位势木,經(jīng)過了不知道多少個(gè)版本,為了保持兼容性槽卫,再版本不停的升級變化中跟压,自然就引入了這么多個(gè)宏。
如WINVER這個(gè)宏的歷史可以追溯到16位的windows歼培,當(dāng)時(shí)用于做頭文件的版本控制震蒋;后來windows NT出現(xiàn)了,因而又引入了_WIN32_WINNT來隔離開NT相關(guān)的特性躲庄;再后來win95出現(xiàn)了查剖,這時(shí)又引入了_WIN32_WINDOWS來控制哪些win95引入的特性;
上述三個(gè)宏在后續(xù)的windows開發(fā)中就這么一直存在了下來噪窘,到現(xiàn)在來說WINVER還是在很多的windows頭文件中出現(xiàn)笋庄,_WIN32_WINDOWS由于從xp開始,windows都使用nt內(nèi)核倔监,就很少用了直砂,_WIN32_WINNT這個(gè)宏現(xiàn)在還是在大量使用的。
到了Vista的時(shí)代浩习,windows的開發(fā)人員也覺得是時(shí)候要終結(jié)一下這種亂象了静暂,于是sdk組和ddk組的人一起合作,引入了NTDDI_VERSION這個(gè)宏(sdkddkver.h)谱秽,只要單獨(dú)定義NTDDI_VERSION這個(gè)宏即可洽蛀。
但是這里有個(gè)前提,就是需要你的程序面向的是Vista以上的版本疟赊;如果你還要支持到XP郊供,那么還必須再定義_WIN32_WINNT這個(gè)宏。這是因?yàn)槿绻欢xNTDDI_VERSION這個(gè)宏而不定義_WIN32_WINNT的話近哟,在sdkddkver.h中可以到驮审,_WIN32_WINNT會被默認(rèn)定義為Vista的版本。(其他兩個(gè)宏是保持和_WIN32_WINNT一致)
總結(jié)
用VS2008創(chuàng)建工程的時(shí)候,會自動幫我們創(chuàng)建targetver.h頭文件头岔,我們只需要在這里定義windows相關(guān)的版本宏即可塔拳。
假如你的程序需要支持的最低windows版本是xp,那就定義_WIN32_WINNT和NTDDI_VERSION峡竣;
假如你的程序最低支持的windows版本是vista靠抑,那只定義NTDDI_VERSIN即可。
另外适掰,sdkddkver.h已經(jīng)幫我們定義好了各個(gè)windows發(fā)行版本對應(yīng)的版本號颂碧,我們直接用這些宏就更加直觀了。