OSVERSIONINFOEXW
構造体サイズ=各フィールドのバイト数(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 | WCHAR | 256 | +20 | +20 | システムにインストールされている最新の Service Pack を示す、「Service Pack 3」のような null 終端文字列。 Service Pack がインストールされていない場合、この文字列は空です。 | ||||||||||||||||||||||||||||||
| wServicePackMajor | WORD | 2 | +276 | +276 | システムにインストールされている最新の Service Pack のメジャー バージョン番号。たとえば Service Pack 3 の場合、 メジャー バージョン番号は 3 です。Service Pack がインストールされていない場合、値は 0 です。 | ||||||||||||||||||||||||||||||
| wServicePackMinor | WORD | 2 | +278 | +278 | システムにインストールされている最新の Service Pack のマイナー バージョン番号。たとえば Service Pack 3 の場合、 マイナー バージョン番号は 0 です。 | ||||||||||||||||||||||||||||||
| wSuiteMask | WORD | 2 | +280 | +280 | システムで利用可能な製品スイートを識別するビット マスク。このメンバーには、次の値の組み合わせを指定できます。
| ||||||||||||||||||||||||||||||
| wProductType | BYTE | 1 | +282 | +282 | システムに関する追加情報。このメンバーには、次のいずれかの値を指定できます。
| ||||||||||||||||||||||||||||||
| wReserved | BYTE | 1 | +283 | +283 | 将来の使用のために予約済みです。 |
公式ドキュメント
オペレーティング システムのバージョン情報を格納します。この情報には、メジャー バージョン番号とマイナー バージョン番号、ビルド番号、プラットフォーム識別子、および製品スイートとシステムにインストールされている最新の 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 ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして OSVERSIONINFOEX を定義します。このエンコーディング中立のエイリアスを、エンコーディング中立でないコードと混在させて使用すると、不一致が生じてコンパイル エラーや実行時エラーの原因となることがあります。詳細については、Conventions for Function Prototypes を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// OSVERSIONINFOEXW (x64 284 / x86 284 バイト)
typedef struct OSVERSIONINFOEXW {
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformId;
WCHAR szCSDVersion[128];
WORD wServicePackMajor;
WORD wServicePackMinor;
WORD wSuiteMask;
BYTE wProductType;
BYTE wReserved;
} OSVERSIONINFOEXW;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct OSVERSIONINFOEXW
{
public uint dwOSVersionInfoSize;
public uint dwMajorVersion;
public uint dwMinorVersion;
public uint dwBuildNumber;
public uint dwPlatformId;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string 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 OSVERSIONINFOEXW
Public dwOSVersionInfoSize As UInteger
Public dwMajorVersion As UInteger
Public dwMinorVersion As UInteger
Public dwBuildNumber As UInteger
Public dwPlatformId As UInteger
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public szCSDVersion As String
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 OSVERSIONINFOEXW(ctypes.Structure):
_fields_ = [
("dwOSVersionInfoSize", wintypes.DWORD),
("dwMajorVersion", wintypes.DWORD),
("dwMinorVersion", wintypes.DWORD),
("dwBuildNumber", wintypes.DWORD),
("dwPlatformId", wintypes.DWORD),
("szCSDVersion", ctypes.c_wchar * 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 OSVERSIONINFOEXW {
pub dwOSVersionInfoSize: u32,
pub dwMajorVersion: u32,
pub dwMinorVersion: u32,
pub dwBuildNumber: u32,
pub dwPlatformId: u32,
pub szCSDVersion: [u16; 128],
pub wServicePackMajor: u16,
pub wServicePackMinor: u16,
pub wSuiteMask: u16,
pub wProductType: u8,
pub wReserved: u8,
}import "golang.org/x/sys/windows"
type OSVERSIONINFOEXW struct {
dwOSVersionInfoSize uint32
dwMajorVersion uint32
dwMinorVersion uint32
dwBuildNumber uint32
dwPlatformId uint32
szCSDVersion [128]uint16
wServicePackMajor uint16
wServicePackMinor uint16
wSuiteMask uint16
wProductType byte
wReserved byte
}type
OSVERSIONINFOEXW = record
dwOSVersionInfoSize: DWORD;
dwMajorVersion: DWORD;
dwMinorVersion: DWORD;
dwBuildNumber: DWORD;
dwPlatformId: DWORD;
szCSDVersion: array[0..127] of WideChar;
wServicePackMajor: Word;
wServicePackMinor: Word;
wSuiteMask: Word;
wProductType: Byte;
wReserved: Byte;
end;const OSVERSIONINFOEXW = extern struct {
dwOSVersionInfoSize: u32,
dwMajorVersion: u32,
dwMinorVersion: u32,
dwBuildNumber: u32,
dwPlatformId: u32,
szCSDVersion: [128]u16,
wServicePackMajor: u16,
wServicePackMinor: u16,
wSuiteMask: u16,
wProductType: u8,
wReserved: u8,
};type
OSVERSIONINFOEXW {.bycopy.} = object
dwOSVersionInfoSize: uint32
dwMajorVersion: uint32
dwMinorVersion: uint32
dwBuildNumber: uint32
dwPlatformId: uint32
szCSDVersion: array[128, uint16]
wServicePackMajor: uint16
wServicePackMinor: uint16
wSuiteMask: uint16
wProductType: uint8
wReserved: uint8struct OSVERSIONINFOEXW
{
uint dwOSVersionInfoSize;
uint dwMajorVersion;
uint dwMinorVersion;
uint dwBuildNumber;
uint dwPlatformId;
wchar[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 レイアウト)
; OSVERSIONINFOEXW サイズ: 284 バイト(x64)
dim st, 71 ; 4byte整数×71(構造体サイズ 284 / 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 : WCHAR (+20, 256byte) varptr(st)+20 を基点に操作(256byte:入れ子/配列)
; wServicePackMajor : WORD (+276, 2byte) wpoke st,276,値 / 値 = wpeek(st,276)
; wServicePackMinor : WORD (+278, 2byte) wpoke st,278,値 / 値 = wpeek(st,278)
; wSuiteMask : WORD (+280, 2byte) wpoke st,280,値 / 値 = wpeek(st,280)
; wProductType : BYTE (+282, 1byte) poke st,282,値 / 値 = peek(st,282)
; wReserved : BYTE (+283, 1byte) poke st,283,値 / 値 = peek(st,283)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global OSVERSIONINFOEXW
#field int dwOSVersionInfoSize
#field int dwMajorVersion
#field int dwMinorVersion
#field int dwBuildNumber
#field int dwPlatformId
#field wchar szCSDVersion 128
#field short wServicePackMajor
#field short wServicePackMinor
#field short wSuiteMask
#field byte wProductType
#field byte wReserved
#endstruct
stdim st, OSVERSIONINFOEXW ; NSTRUCT 変数を確保
st->dwOSVersionInfoSize = 100
mes "dwOSVersionInfoSize=" + st->dwOSVersionInfoSize