GetVersionEx()
OS の種別 ( 9x / NT )
やバージョンなどを詳細に得るための関数です。
バージョンを判別して処理を分岐させるコーディングは、「Windows2000
以降でしか使えない API や Windows95 OSR2
以降でのみサポートされている FAT32
の機能などを用いたいが、旧バージョンの OS
でも動作させたい」…そんなアプリケーションでは必須の処理となります。
VB では DLL
の動的ロードが出来ないので処理の分岐が難しく、あまり活躍は出来ないかもしれませんが…。
'標準モジュールに記述します。 Option Explicit Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _ (lpVersionInformation As OSVERSIONINFO) As Long Public Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End Type Public Const VER_PLATFORM_WIN32_NT = 2 Public Const VER_PLATFORM_WIN32_WINDOWS = 1 Public Const VER_PLATFORM_WIN32s = 0 Public Function LOWORD(dwValue As Long) As Long '引数の下位16ビットを返します LOWORD = (dwValue And &HFFFF&) End Function
実行例:
'以下のようにして情報を取得します。 Dim osi As OSVERSIONINFO Dim lngRet As Long osi.dwOSVersionInfoSize = Len(osi) lngRet = GetVersionEx(osi) With osi '詳細は MSDN で OSVERSIONINFO 構造体の項を参照のこと Debug.Print .dwPlatformId Debug.Print .dwMajorVersion Debug.Print .dwMinorVersion If .dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then Debug.Print LOWORD(.dwBuildNumber) Else Debug.Print .dwBuildNumber End If Debug.Print Left$(.szCSDVersion, InStr(.szCSDVersion, vbNullChar) - 1) End With ' こんな感じで処理を分岐させます ' Select Case osi.dwPlatformId ' Case VER_PLATFORM_WIN32_WINDOWS ' Select Case osi.dwMajorVersion ' Case 4 ' Select Case osi.dwMinorVersion ' Case 0 ' Select Case LOWORD(osi.dwBuildNumber) ' Case 950 ' 'Windows95, 95A ' Case Is > 1000 ' 'Windows95B(OSR2.0-2.1), 95C(OSR2.5) ' Case Else ' 'エラー ' End Select ' Case 10 ' Select Case LOWORD(osi.dwBuildNumber) ' Case 1998 ' 'Windows98 ' Case Is > 1998 ' 'Windows98 SecondEdition ' Case Else ' '今のところエラー ' End Select ' End Select ' Case Else ' '今のところエラー ( Windows ME はここかな ) ' End Select ' Case VER_PLATFORM_WIN32_NT ' Select Case osi.dwMajorVersion ' Case 4 ' 'Windows NT 4.0 ' Case 5 ' 'Windows 2000 ' End Select ' Case Else ' 'Windows3.1 + Win32s ' End Select
実行結果(まだ中途半端です…)
ちなみに ()
内の値については、私の環境でそうなっているだけで、保証されているのかどうかは知りません(^^;
dwPlatformId | dwMajorVersion | dwMinorVersion | dwBuildNumber | szCSDVersion | |
95 | VER_PLATFORM_WIN32_WINDOWS | 4 | 0 | 950 | |
95 OSR2 | VER_PLATFORM_WIN32_WINDOWS | 4 | 0 | 1000より大きい | |
98 | VER_PLATFORM_WIN32_WINDOWS | 4 | 0より大きい (10) | (1998) | |
98 SE | VER_PLATFORM_WIN32_WINDOWS | 4 | 0より大きい (10) | (2222) | "A" |
NT 4.0 | VER_PLATFORM_WIN32_NT | 4 | |||
2000 | VER_PLATFORM_WIN32_NT | 5 | 0 | (2195) | "" |
2000 SP1 | VER_PLATFORM_WIN32_NT | 5 | 0 | (2195) | "Service Pack 1" |