VC中最簡便判斷操作系統版本的方法

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 _WINMAIN_

#ifdef WPRFLAG
void wWinMainCRTStartup(
#else  /* WPRFLAG */
void WinMainCRTStartup(
#endif  /* WPRFLAG */

#else  /* _WINMAIN_ */

#ifdef WPRFLAG
void wmainCRTStartup(
#else  /* WPRFLAG */
void mainCRTStartup(
#endif  /* WPRFLAG */

#endif  /* _WINMAIN_ */
        void
        )

{
        int mainret;

#ifdef _WINMAIN_
        _TUCHAR *lpszCommandLine;
        STARTUPINFO StartupInfo;
#endif  /* _WINMAIN_ */

        /*
         * Get the full Win32 version
         */
        _osver = GetVersion();

        _winminor = (_osver >> 8) & 0x00FF ;
        _winmajor = _osver & 0x00FF ;
        _winver = (_winmajor << 8) + _winminor;
        _osver = (_osver >> 16) & 0x00FFFF ;
/// 後面的與本文討論的無關,省略

    得到兩點重要的信息:

  1. <?xml:namespace prefix = o />

    VC的確已經幫我們獲得了系統版本號,而且解析後分別用_osver、_winminor、_winmajor、_winver這四個unsigned int類型的數據來保存了Windows的測試版本號、Windows的次要版本號、Windows的主要版本號和Windows版本號(major version 和minor version的混合體,實在是不知道怎麼命名)。在下次使用的時候無需再調用GetVersion API。

  2. 無論Windows程序用哪種啓動函數開始,程序都會使用這4個變量來存放系統版本信息。

        此外,VC爲我們初始化的變量還有:

  • _environ / _wenviron: 類型 char ** / wchar_t **,每個字符串指向一個環境變量。
  • _pgmptr / _wpgmptr: 類型 char * / wchar_t *,運行程序的全路徑和名字。
發佈了23 篇原創文章 · 獲贊 3 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章