OSVERSIONINFOEXA
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dwOSVersionInfoSize | DWORD | 4 | +0 | +0 | このデータ構造体のサイズ (バイト単位)。このメンバーには
sizeof(OSVERSIONINFOEX) を設定します。 | ||||||||||||||||||||||||||||||
| dwMajorVersion | DWORD | 4 | +4 | +4 | オペレーティングシステムのメジャーバージョン番号。詳細については「解説」を参照してください。 | ||||||||||||||||||||||||||||||
| dwMinorVersion | DWORD | 4 | +8 | +8 | オペレーティングシステムのマイナーバージョン番号。詳細については「解説」を参照してください。 | ||||||||||||||||||||||||||||||
| dwBuildNumber | DWORD | 4 | +12 | +12 | オペレーティングシステムのビルド番号。 | ||||||||||||||||||||||||||||||
| dwPlatformId | DWORD | 4 | +16 | +16 | オペレーティングシステムのプラットフォーム。このメンバーには VER_PLATFORM_WIN32_NT (2) を指定できます。 | ||||||||||||||||||||||||||||||
| szCSDVersion | CHAR | 128 | +20 | +20 | システムにインストールされている最新の Service Pack を示す、"Service Pack 3" のような null 終端文字列。 Service Pack がインストールされていない場合、文字列は空です。 | ||||||||||||||||||||||||||||||
| wServicePackMajor | WORD | 2 | +148 | +148 | システムにインストールされている最新の Service Pack のメジャーバージョン番号。たとえば Service Pack 3 の場合、 メジャーバージョン番号は 3 です。Service Pack がインストールされていない場合、値は 0 です。 | ||||||||||||||||||||||||||||||
| wServicePackMinor | WORD | 2 | +150 | +150 | システムにインストールされている最新の Service Pack のマイナーバージョン番号。たとえば Service Pack 3 の場合、 マイナーバージョン番号は 0 です。 | ||||||||||||||||||||||||||||||
| wSuiteMask | WORD | 2 | +152 | +152 | システムで利用可能な製品スイートを識別するビットマスク。このメンバーには、 次の値の組み合わせを指定できます。
| ||||||||||||||||||||||||||||||
| wProductType | BYTE | 1 | +154 | +154 | システムに関する追加情報。このメンバーには、次のいずれかの値を指定できます。
| ||||||||||||||||||||||||||||||
| wReserved | BYTE | 1 | +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 公式リファレンス: 英語 (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 Structureimport 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: uint8struct 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