kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

環境チェック

ウィンドウズ開発統括部のblogで、.NET Framework 2.0インストール時にはGetVersionEx()を使ってチェックしている…というお話がありましたが、Windows 2000以降のみでよいのであれば、たぶんVerifyVersionInfo()を使った方が楽です。このAPI使えば複数のOS範囲を一括で判定できますので、長ったらしいチェックがだいぶ消えるんじゃないでしょうか。Windows 9xサポートしない場合の判定は?ということであれば、GetProcAddress()で失敗すればWindows 9x/Meとなります。
私のお仕事ではTerminal Serviceで動作しているか、WorkstationかServerかといったチェックが重要だし、使ってみたかったこともあって、VerifyVersionInfo()を使ってます。
たとえば、ユーザ簡易切替(fast user switch)で動いているのか、ほんとにTerminal Serviceで動いているのかといった場合、こんなチェックでWindows XP以降かどうかを判定してから、Terminal Serviceのチェックを行っています。OSの範囲チェックをする場合、判定順序があるので、ヘルプを読んでからやりましょう。

    OSVERSIONINFOEX osvi;
    ULONGLONG       comparisonMask;
    BOOL            fRet = FALSE;

    ZeroMemory (&osvi, sizeof(osvi));
    osvi.dwOSVersionInfoSize = sizeof(osvi);

    osvi.dwMajorVersion = 5;
    osvi.dwMinorVersion = 1;
    osvi.wProductType = VER_NT_WORKSTATION;
    comparisonMask = 0;
    comparisonMask = VerSetConditionMask (comparisonMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
    comparisonMask = VerSetConditionMask (comparisonMask, VER_MINORVERSION, VER_GREATER_EQUAL);
    comparisonMask = VerSetConditionMask (comparisonMask, VER_PRODUCT_TYPE, VER_EQUAL);
    fRet = VerifyVersionInfo (&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_PRODUCT_TYPE, comparisonMask);
    if(fRet == FALSE) {
        DWORD   dwErr = GetLastError();
        if(dwErr ==  ERROR_OLD_WIN_VERSION) {
            puts("Windows XP以降じゃないよーん");
        }
    }

そういえば、Vistaではユーザ簡易切替で同時2セッションログインできるようになる…とどこかで読んだ気がします…はぁ。