VB で使うならこう。
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInfo As Any) As Long
引数には構造体を渡す。
Private Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End Type
より新しい版 (Windoze NT 4.0 SP6 以降) では、 EX の方の構造体に対応。 こっちのほーがより多くの情報を取れる。
Private Type OSVERSIONINFOEX dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 wServicePackMajor As Integer wServicePackMinor As Integer wSuiteMask As Integer wProductType As Byte wReserved As Byte End Type
API 関数の返し値が 0 なら失敗。であるからにして、最初に EX の方を渡してみて、 0 だったら EX じゃ無い方で試してみる。
Revision の実際の値を得るには & 0xFFFF する。 (という説明は 厳密じゃないけど、まーいいや。)
詳しくは M$DN 見てちょ。
Win9x 系
[2] 以下のは構成ファイル (DLL とか) の値らしいんだけど、 GetVersionEx の値で返ってくるのか不明 (M$DN に載ってない)。
[3] >>2 といいつつ、 4.00.1111 も M$DN になかったけど、実際にやってみたら返って来ることがわかった。
WinNT 系
細かい版情報の文字列。 Windoze 95 だと、 [AaBbCc] がかえって来得る。 (大文字・小文字どちらもあり得るらしい。 M$ は何考えてるんだ?)
Windoze NT だと、「Service Pack x」が返って来得る。 (M$ のことだから、 版によっては「サーヒ゛ス ハ゜ック 1」とかが版によっては 返りそうだけど(藁)、幸いそういう話は見かけないね。)
[1] OSR2 は実際にやってみると " B" が返ってきた。
VER_NT_WORKSTATION = 0x40000000 だと Workstation 系 (Windoze NT Workstation, Windoze 2000 Professional), VER_NT_SERVER = 0x80000000 だと Server 系 (Windoze NT Server, Windoze 2000 Server, Windoze 2002 .NET Server)。
ビットマスク。
HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions で "ProductType" から Workstation とかが取れる。