GetVersion和GetVersionEx函數詳解

出自:http://flyxxtt.blogbus.com/logs/42705986.html

Windows API 中有兩個函數可以得到系統版本信息GetVersionGetVersionEx

     GetVersion這個函數曾經困擾了很多程序員,其本來設計的是在DWORD返回值中用低位的那個字表示MS-DOS的版本號,高位的那個字表示Windows版本號。對於每個字來說,高位字節代表主要版本號,低位字節代表次要版本號。可是因爲編寫此函數的程序員犯了一個錯誤,使得此函數返回的Windows版本號顛倒了(即把主要版本號放到了低位字節,而次要版本號放到了高位字節)。當發現此錯誤的時候已經有很多程序員在使用這個函數了,Microsoft只好將錯就錯,直接把原來的API文檔給改了過來。

      爲了解決GetVersion帶來的問題,Microsoft後來開發了一個新的函數GetVersionEx,用它能夠得到更詳細的Windows系統的版本信息,下面我就寫寫GetVersionEx的使用方法。

 

函數原型:

BOOL GetVersionEx(POSVERSIONINFO pVersionInformation);

我們先來看看OSVERSIONINFOEX這個結構:

typedef struct {

DWORD dwOSVersionInfoSize;       //在使用GetVersionEx之前要將此初始化爲結構的大小

DWORD dwMajorVersion;               //系統主版本號

DWORD dwMinorVersion;               //系統次版本號

DWORD dwBuildNumber;               //系統構建號

DWORD dwPlatformId;                  //系統支持的平臺(詳見附1)

TCHAR szCSDVersion[128];          //系統補丁包的名稱

WORD wServicePackMajor;            //系統補丁包的主版本

WORD wServicePackMinor;            //系統補丁包的次版本

WORD wSuiteMask;                      //標識系統上的程序組(詳見附2)

BYTE wProductType;                    //標識系統類型(詳見附3)

BYTE wReserved;                         //保留,未使用

} OSVERSIONINFOEX, *POSVERSIONINFOEX;

這個結構在Windows 2000後出現,老版本的OSVERSIONINFO結構沒有wServicePackMajor、wServicePackMinor、wSuiteMask、wProductType和wReserved這幾個成員。

 

接着在調用函數之前先初始化結構的大小:

OSVERSIONINFOEX os;

os.dwOSVersionInfoSize=sizeof(os);

函數返回值爲TRUE表示成功:

if(!GetVersionEx((OSVERSIONINFO *)&os))

{

      return FALSE;

}

函數調用成功以後就可以通過OSVERSIONINFOEX來查看系統的版本信息了。

 

下面是一個通過系統版本來判斷操作系統名稱的例子:

CString getSystemName()

{

    SYSTEM_INFO info;                                   //用SYSTEM_INFO結構判斷64位AMD處理器
    GetSystemInfo(&info);                               //調用GetSystemInfo函數填充結構
    OSVERSIONINFOEX os;
    os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX); 
    if(GetVersionEx((OSVERSIONINFO *)&os))                  
    {
        CString vname;

        //下面根據版本信息判斷操作系統名稱

        switch(os.dwMajorVersion){                        //判斷主版本號
            case 4:
                switch(os.dwMinorVersion){                //判斷次版本號
                    case 0:
                        if(os.dwPlatformId==VER_PLATFORM_WIN32_NT)
             

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章