Windowsの版を調べる

Windowsの版を調べる

GetVersionEx Win32API

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 見てちょ。

dwPlatformId

Major.Minor.Revision

Win9x 系

[2] 以下のは構成ファイル (DLL とか) の値らしいんだけど、 GetVersionEx の値で返ってくるのか不明 (M$DN に載ってない)。

[3] >>2 といいつつ、 4.00.1111 も M$DN になかったけど、実際にやってみたら返って来ることがわかった。

szCSDVersion

細かい版情報の文字列。 Windoze 95 だと、 [AaBbCc] がかえって来得る。 (大文字・小文字どちらもあり得るらしい。 M$ は何考えてるんだ?)

Windoze NT だと、「Service Pack x」が返って来得る。 (M$ のことだから、 版によっては「サーヒ゛ス ハ゜ック 1」とかが版によっては 返りそうだけど(藁)、幸いそういう話は見かけないね。)

Windoze 95 + "A"
Windoze 95 SP1/OSR1
Windoze 95 + "B"
Windoze 95 OSR2/OSR2.1
Windoze 95 + "C"
Windoze 95 OSR2.5
Windoze 98 + "A"
Windoze 95 Second Edition

[1] OSR2 は実際にやってみると " B" が返ってきた。

wProductType

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)。

wSuiteMask

ビットマスク。

VER_SUITE_PERSONAL = 0x200
Home (Windoze XP Home Edition)
VER_SUITE_DATACENTER
DataCenter Server
VER_SUITE_ENTERPRISE
Advanced Server (NT4), Enterprise Server
VER_SUITE_BLADE
Web Server

レジストリから取得

HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions で "ProductType" から Workstation とかが取れる。

"ServerNT"
Advanced Server
"RANMANNT"
Server
"WinNT"
Workstation, Professional

See also

メモ