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"

戻る