ウィンドウズ開発統括部の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セッションログインできるようになる…とどこかで読んだ気がします…はぁ。