Win32 API 日本語リファレンス
ホームSystem.SystemInformation › OSVERSIONINFOEXA

OSVERSIONINFOEXA

構造体
サイズx64: 156 バイト / x86: 156 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
dwOSVersionInfoSizeDWORD4+0+0このデータ構造体のサイズ (バイト単位)。このメンバーには sizeof(OSVERSIONINFOEX) を設定します。
dwMajorVersionDWORD4+4+4オペレーティングシステムのメジャーバージョン番号。詳細については「解説」を参照してください。
dwMinorVersionDWORD4+8+8オペレーティングシステムのマイナーバージョン番号。詳細については「解説」を参照してください。
dwBuildNumberDWORD4+12+12オペレーティングシステムのビルド番号。
dwPlatformIdDWORD4+16+16オペレーティングシステムのプラットフォーム。このメンバーには VER_PLATFORM_WIN32_NT (2) を指定できます。
szCSDVersionCHAR128+20+20システムにインストールされている最新の Service Pack を示す、"Service Pack 3" のような null 終端文字列。 Service Pack がインストールされていない場合、文字列は空です。
wServicePackMajorWORD2+148+148システムにインストールされている最新の Service Pack のメジャーバージョン番号。たとえば Service Pack 3 の場合、 メジャーバージョン番号は 3 です。Service Pack がインストールされていない場合、値は 0 です。
wServicePackMinorWORD2+150+150システムにインストールされている最新の Service Pack のマイナーバージョン番号。たとえば Service Pack 3 の場合、 マイナーバージョン番号は 0 です。
wSuiteMaskWORD2+152+152

システムで利用可能な製品スイートを識別するビットマスク。このメンバーには、 次の値の組み合わせを指定できます。

意味
VER_SUITE_BACKOFFICE
0x00000004
Microsoft BackOffice コンポーネントがインストールされています。
VER_SUITE_BLADE
0x00000400
Windows Server 2003, Web Edition がインストールされています。
VER_SUITE_COMPUTE_SERVER
0x00004000
Windows Server 2003, Compute Cluster Edition がインストールされています。
VER_SUITE_DATACENTER
0x00000080
Windows Server 2008 Datacenter、Windows Server 2003, Datacenter Edition、または Windows 2000 Datacenter Server がインストールされています。
VER_SUITE_ENTERPRISE
0x00000002
Windows Server 2008 Enterprise、Windows Server 2003, Enterprise Edition、または Windows 2000 Advanced Server がインストールされています。このビットフラグの詳細については、 「解説」セクションを参照してください。
VER_SUITE_EMBEDDEDNT
0x00000040
Windows XP Embedded がインストールされています。
VER_SUITE_PERSONAL
0x00000200
Windows Vista Home Premium、Windows Vista Home Basic、または Windows XP Home Edition がインストールされています。
VER_SUITE_SINGLEUSERTS
0x00000100
リモートデスクトップはサポートされますが、対話型セッションは 1 つのみサポートされます。この値は、 システムがアプリケーションサーバーモードで実行されていない限り設定されます。
VER_SUITE_SMALLBUSINESS
0x00000001
Microsoft Small Business Server がかつてこのシステムにインストールされていましたが、別のバージョンの Windows にアップグレードされている可能性があります。このビットフラグの詳細については、「解説」セクションを参照してください。
VER_SUITE_SMALLBUSINESS_RESTRICTED
0x00000020
Microsoft Small Business Server が、制限付きクライアントライセンスが有効な状態でインストールされています。詳細については、 「解説」セクションを参照してください。
VER_SUITE_STORAGE_SERVER
0x00002000
Windows Storage Server 2003 R2 または Windows Storage Server 2003 がインストールされています。
VER_SUITE_TERMINAL
0x00000010
ターミナルサービスがインストールされています。この値は常に設定されます。

VER_SUITE_TERMINAL が設定されていて VER_SUITE_SINGLEUSERTS が設定されていない場合、システムはアプリケーションサーバーモードで実行されています。

VER_SUITE_WH_SERVER
0x00008000
Windows Home Server がインストールされています。
VER_SUITE_MULTIUSERTS
0x00020000
AppServer モードが有効になっています。
wProductTypeBYTE1+154+154

システムに関する追加情報。このメンバーには、次のいずれかの値を指定できます。

意味
VER_NT_DOMAIN_CONTROLLER
0x0000002
システムはドメインコントローラーであり、オペレーティングシステムは Windows Server 2012、Windows Server 2008 R2、Windows Server 2008、 Windows Server 2003、または Windows 2000 Server です。
VER_NT_SERVER
0x0000003
オペレーティングシステムは Windows Server 2012、Windows Server 2008 R2、Windows Server 2008、Windows Server 2003、または Windows 2000 Server です。

ドメインコントローラーでもあるサーバーは、VER_NT_SERVER ではなく VER_NT_DOMAIN_CONTROLLER として報告される点に注意してください。

VER_NT_WORKSTATION
0x0000001
オペレーティングシステムは Windows 8、Windows 7、Windows Vista、Windows XP Professional、 Windows XP Home Edition、または Windows 2000 Professional です。
wReservedBYTE1+155+155将来の使用のために予約済みです。

公式ドキュメント

オペレーティングシステムのバージョン情報を格納します。この情報には、メジャーバージョン番号とマイナーバージョン番号、 ビルド番号、プラットフォーム識別子、および製品スイートとシステムにインストールされている最新の Service Pack に関する情報が 含まれます。この構造体は GetVersionEx 関数および VerifyVersionInfo 関数と共に使用されます。

解説(Remarks)

機能の有無を調べる方法として、バージョン情報に依存するのは最善ではありません。代わりに、対象となる機能の ドキュメントを参照してください。機能検出の一般的な手法の詳細については、 Operating System Version を参照してください。

特定のオペレーティングシステムを必須とする場合は、その 1 つのオペレーティングシステムだけを対象とするテストを設計するのではなく、 サポートされる最小バージョンとして扱うようにしてください。そうすることで、検出コードは将来のバージョンの Windows でも 引き続き動作します。

次の表は、サポートされている各バージョンの Windows が返す値をまとめたものです。バージョン番号が同一のオペレーティングシステムを区別するには、「その他」列の情報を使用してください。

オペレーティングシステム バージョン番号 dwMajorVersion dwMinorVersion その他
Windows 10 10.0* 10 0 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2016 10.0* 10 0 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows 8.1 6.3* 6 3 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2012 R2 6.3* 6 3 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows 8 6.2 6 2 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2012 6.2 6 2 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows 7 6.1 6 1 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2008 R2 6.1 6 1 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows Server 2008 6.0 6 0 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows Vista 6.0 6 0 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2003 R2 5.2 5 2 GetSystemMetrics(SM_SERVERR2) != 0
Windows Home Server 5.2 5 2 OSVERSIONINFOEX.wSuiteMask & VER_SUITE_WH_SERVER
Windows Server 2003 5.2 5 2 GetSystemMetrics(SM_SERVERR2) == 0
Windows XP Professional x64 Edition 5.2 5 2 (OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION) && (SYSTEM_INFO.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
Windows XP 5.1 5 1 該当なし
Windows 2000 5.0 5 0 該当なし
* Windows 8.1 または Windows 10 向けにマニフェストが指定されているアプリケーションの場合の値です。Windows 8.1 または Windows 10 向けにマニフェストが指定されていないアプリケーションでは、Windows 8 の OS バージョン値 (6.2) が返されます。アプリケーションに Windows 8.1 または Windows 10 向けのマニフェストを指定するには、Targeting your application for Windows を参照してください。

Small Business Server がシステムにインストールされているかどうかを判断する際に、VER_SUITE_SMALLBUSINESS フラグだけに 依存してはいけません。この製品スイートがインストールされると、このフラグと VER_SUITE_SMALLBUSINESS_RESTRICTED フラグの両方が設定されるためです。 このインストールを Windows Server, Standard Edition にアップグレードすると、 VER_SUITE_SMALLBUSINESS_RESTRICTED フラグはクリアされますが、 VER_SUITE_SMALLBUSINESS flag は設定されたまま残ります。この場合、それは Small Business Server が かつてこのシステムにインストールされていたことを示します。さらに Windows Server, Enterprise Edition にアップグレードした場合も、VER_SUITE_SMALLBUSINESS フラグは設定されたまま残ります。

互換モードが有効な場合、OSVERSIONINFOEX 構造体には アプリケーション互換性 のために選択されたオペレーティングシステムの情報が格納されます。

Win32 ベースのアプリケーションが WOW64 上で実行されているかどうかを判断するには、 IsWow64Process 関数を呼び出します。システムが 64 ビット版の Windows を実行しているかどうかを判断するには、GetNativeSystemInfo 関数を呼び出します。

GetSystemMetrics 関数は、現在のオペレーティングシステムに関する 次の追加情報を提供します。

製品 設定
Windows Server 2003 R2 SM_SERVERR2
Windows XP Media Center Edition SM_MEDIACENTER
Windows XP Starter Edition SM_STARTER
Windows XP Tablet PC Edition SM_TABLETPC

例については、 Getting the System Version を参照してください。

メモ

winnt.h ヘッダーは OSVERSIONINFOEX を、UNICODE プリプロセッサ定数の定義に応じてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして定義しています。エンコーディング非依存のエイリアスの使用と、エンコーディング非依存でないコードを混在させると不一致が生じ、コンパイルエラーや実行時エラーの原因となる可能性があります。詳細については、Conventions for Function Prototypes を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// OSVERSIONINFOEXA  (x64 156 / x86 156 バイト)
typedef struct OSVERSIONINFOEXA {
    DWORD dwOSVersionInfoSize;
    DWORD dwMajorVersion;
    DWORD dwMinorVersion;
    DWORD dwBuildNumber;
    DWORD dwPlatformId;
    CHAR szCSDVersion[128];
    WORD wServicePackMajor;
    WORD wServicePackMinor;
    WORD wSuiteMask;
    BYTE wProductType;
    BYTE wReserved;
} OSVERSIONINFOEXA;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct OSVERSIONINFOEXA
{
    public uint dwOSVersionInfoSize;
    public uint dwMajorVersion;
    public uint dwMinorVersion;
    public uint dwBuildNumber;
    public uint dwPlatformId;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public sbyte[] szCSDVersion;
    public ushort wServicePackMajor;
    public ushort wServicePackMinor;
    public ushort wSuiteMask;
    public byte wProductType;
    public byte wReserved;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure OSVERSIONINFOEXA
    Public dwOSVersionInfoSize As UInteger
    Public dwMajorVersion As UInteger
    Public dwMinorVersion As UInteger
    Public dwBuildNumber As UInteger
    Public dwPlatformId As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=128)> Public szCSDVersion() As SByte
    Public wServicePackMajor As UShort
    Public wServicePackMinor As UShort
    Public wSuiteMask As UShort
    Public wProductType As Byte
    Public wReserved As Byte
End Structure
import ctypes
from ctypes import wintypes

class OSVERSIONINFOEXA(ctypes.Structure):
    _fields_ = [
        ("dwOSVersionInfoSize", wintypes.DWORD),
        ("dwMajorVersion", wintypes.DWORD),
        ("dwMinorVersion", wintypes.DWORD),
        ("dwBuildNumber", wintypes.DWORD),
        ("dwPlatformId", wintypes.DWORD),
        ("szCSDVersion", ctypes.c_byte * 128),
        ("wServicePackMajor", ctypes.c_ushort),
        ("wServicePackMinor", ctypes.c_ushort),
        ("wSuiteMask", ctypes.c_ushort),
        ("wProductType", ctypes.c_ubyte),
        ("wReserved", ctypes.c_ubyte),
    ]
#[repr(C)]
pub struct OSVERSIONINFOEXA {
    pub dwOSVersionInfoSize: u32,
    pub dwMajorVersion: u32,
    pub dwMinorVersion: u32,
    pub dwBuildNumber: u32,
    pub dwPlatformId: u32,
    pub szCSDVersion: [i8; 128],
    pub wServicePackMajor: u16,
    pub wServicePackMinor: u16,
    pub wSuiteMask: u16,
    pub wProductType: u8,
    pub wReserved: u8,
}
import "golang.org/x/sys/windows"

type OSVERSIONINFOEXA struct {
	dwOSVersionInfoSize uint32
	dwMajorVersion uint32
	dwMinorVersion uint32
	dwBuildNumber uint32
	dwPlatformId uint32
	szCSDVersion [128]int8
	wServicePackMajor uint16
	wServicePackMinor uint16
	wSuiteMask uint16
	wProductType byte
	wReserved byte
}
type
  OSVERSIONINFOEXA = record
    dwOSVersionInfoSize: DWORD;
    dwMajorVersion: DWORD;
    dwMinorVersion: DWORD;
    dwBuildNumber: DWORD;
    dwPlatformId: DWORD;
    szCSDVersion: array[0..127] of Shortint;
    wServicePackMajor: Word;
    wServicePackMinor: Word;
    wSuiteMask: Word;
    wProductType: Byte;
    wReserved: Byte;
  end;
const OSVERSIONINFOEXA = extern struct {
    dwOSVersionInfoSize: u32,
    dwMajorVersion: u32,
    dwMinorVersion: u32,
    dwBuildNumber: u32,
    dwPlatformId: u32,
    szCSDVersion: [128]i8,
    wServicePackMajor: u16,
    wServicePackMinor: u16,
    wSuiteMask: u16,
    wProductType: u8,
    wReserved: u8,
};
type
  OSVERSIONINFOEXA {.bycopy.} = object
    dwOSVersionInfoSize: uint32
    dwMajorVersion: uint32
    dwMinorVersion: uint32
    dwBuildNumber: uint32
    dwPlatformId: uint32
    szCSDVersion: array[128, int8]
    wServicePackMajor: uint16
    wServicePackMinor: uint16
    wSuiteMask: uint16
    wProductType: uint8
    wReserved: uint8
struct OSVERSIONINFOEXA
{
    uint dwOSVersionInfoSize;
    uint dwMajorVersion;
    uint dwMinorVersion;
    uint dwBuildNumber;
    uint dwPlatformId;
    byte[128] szCSDVersion;
    ushort wServicePackMajor;
    ushort wServicePackMinor;
    ushort wSuiteMask;
    ubyte wProductType;
    ubyte wReserved;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; OSVERSIONINFOEXA サイズ: 156 バイト(x64)
dim st, 39    ; 4byte整数×39(構造体サイズ 156 / 4 切り上げ)
; dwOSVersionInfoSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; dwMajorVersion : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; dwMinorVersion : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; dwBuildNumber : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; dwPlatformId : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; szCSDVersion : CHAR (+20, 128byte)  varptr(st)+20 を基点に操作(128byte:入れ子/配列)
; wServicePackMajor : WORD (+148, 2byte)  wpoke st,148,値  /  値 = wpeek(st,148)
; wServicePackMinor : WORD (+150, 2byte)  wpoke st,150,値  /  値 = wpeek(st,150)
; wSuiteMask : WORD (+152, 2byte)  wpoke st,152,値  /  値 = wpeek(st,152)
; wProductType : BYTE (+154, 1byte)  poke st,154,値  /  値 = peek(st,154)
; wReserved : BYTE (+155, 1byte)  poke st,155,値  /  値 = peek(st,155)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global OSVERSIONINFOEXA
    #field int dwOSVersionInfoSize
    #field int dwMajorVersion
    #field int dwMinorVersion
    #field int dwBuildNumber
    #field int dwPlatformId
    #field byte szCSDVersion 128
    #field short wServicePackMajor
    #field short wServicePackMinor
    #field short wSuiteMask
    #field byte wProductType
    #field byte wReserved
#endstruct

stdim st, OSVERSIONINFOEXA        ; NSTRUCT 変数を確保
st->dwOSVersionInfoSize = 100
mes "dwOSVersionInfoSize=" + st->dwOSVersionInfoSize