PomeloWu原作©,轉載請指明出處
以前讀《Windows核心編程》的筆記,今天翻出來,居然不曾記得……感慨不少啊,理論和實際如何能脫節?再次懷疑中國的教育,再次對自己的學習態度反省!
如何得到當前系統的版本信息?Windows SDK API: GetVersion/GetVersionEx。
不過在程序中如果僅僅需要最簡單的信息,比如是否Windows XP,Minor Version是多少,就不用再次調用這個API了。呵呵~~我說了“再”是因爲VC已經幫我們做過了這件事。先看看《Windows核心編程》中的一段話:
所有的C/C++運行期啓動函數的作用基本上都是相同的。它們的差別在於,它們究竟是處理ANSI字符串還是Unicode字符串,以及它們在對C運行期庫進行初始化後它們調用哪個進入點函數。Visual C++配有C運行期庫的源代碼。可以在CRT0.c文件中找到這4個啓動函數的代碼。
直接看CRT0.c中有什麼樣的代碼:
/// 前面代碼與本文無關 #ifdef WPRFLAG #else /* _WINMAIN_ */ #ifdef WPRFLAG #endif /* _WINMAIN_ */ { #ifdef _WINMAIN_ /* _winminor = (_osver >> 8) & 0x00FF ; |
得到兩點重要的信息:
-
<?xml:namespace prefix = o />
VC的確已經幫我們獲得了系統版本號,而且解析後分別用_osver、_winminor、_winmajor、_winver這四個unsigned int類型的數據來保存了Windows的測試版本號、Windows的次要版本號、Windows的主要版本號和Windows版本號(major version 和minor version的混合體,實在是不知道怎麼命名)。在下次使用的時候無需再調用GetVersion API。
-
無論Windows程序用哪種啓動函數開始,程序都會使用這4個變量來存放系統版本信息。
此外,VC爲我們初始化的變量還有:
- _environ / _wenviron: 類型 char ** / wchar_t **,每個字符串指向一個環境變量。
- _pgmptr / _wpgmptr: 類型 char * / wchar_t *,運行程序的全路徑和名字。