seclan のほえほえルーム

| |

API: Windows の正確なバージョンを取得する方法

・
2000/09/27 []

 GetVersion または GetVersionEx API を使用すると、Windows のバージョンを取得することができます。しかし、WinME ではそれぞれのアプリケーション毎に、指定された Windows のバージョンを返すことができるので、必ずしも“本当の” Windows のバージョンを取得することができません。本当の Windows のバージョンを取得するには (DOS でも似たようなシステムコールがありましたが)、GetVersionEx の引数で指定する構造体のメンバ dwBuildNumber の値を見ます。下位ワードにはビルド番号が、上位ワードには“本当の”Windows のバージョンが入っています。上位バイトがメジャー番号、下位バイトがマイナー番号です。

vertest.c
#include <stdio.h>
#include <windows.h>

main()
{
    static const char * const strPlatformId[] = {
        "VER_PLATFORM_WIN32s","VER_PLATFORM_WIN32_WINDOWS",
        "VER_PLATFORM_WIN32_NT",
    };
    DWORD dwver;
    OSVERSIONINFO ovi;
    
    dwver = GetVersion();
    ovi.dwOSVersionInfoSize = sizeof(ovi);
    GetVersionEx(&ovi);
    
    //GetVersion
    printf("GetVersion()=%08x\n", dwver);
    printf("GetVersion  :Version=%u.%u\n", 
                                    LOBYTE(dwver), HIBYTE(dwver));
    printf("GetVersion  :PlatformId=%u (%s)\n", 
        dwver>>31, (dwver>>31) ? "Win9X": "WinNT");
    
    //GetVersionEx
    printf("GetVersionEx:Version=%u.%u\n", 
                        ovi.dwMajorVersion, ovi.dwMinorVersion);
    printf("GetVersionEx:dwBuildNumber=%08lx\n", ovi.dwBuildNumber);
    printf("               Version=%u.%u.%u\n", 
                            HIBYTE(HIWORD(ovi.dwBuildNumber)), 
                            LOBYTE(HIWORD(ovi.dwBuildNumber)),
                                    LOWORD(ovi.dwBuildNumber));
    printf("GetVersionEx:PlatformId=%08x (%s)\n", ovi.dwPlatformId,
                ovi.dwPlatformId<3 ? 
                        strPlatformId[ovi.dwPlatformId]: "???");
    printf("GetVersionEx:Info=%s\n", ovi.szCSDVersion);
    
    return 0;
}

実行例: (Win98)
GetVersion()=c0000a04
GetVersion  :Version=4.10
GetVersion  :PlatformId=1 (Win9X)
GetVersionEx:Version=4.10
GetVersionEx:dwBuildNumber=040a07ce
               Version=4.10.1998
GetVersionEx:PlatformId=00000001 (VER_PLATFORM_WIN32_WINDOWS)
GetVersionEx:Info=  


by seclan | コメント (0) | トラックバック (0)

関連

コメント

 コメントできる期間はすでに過ぎています。


トラックバック

 トラックバックできる期間はすでに過ぎています。


| |

 

配信

23.39 msec