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

VerifyVersionInfoA

関数
指定条件でOSのバージョン情報を検証する(ANSI版)。
DLLKERNEL32.dll文字セットANSI (-A)呼出規約winapiSetLastErrorあり対応OSWindows 2000 以降

シグネチャ

// KERNEL32.dll  (ANSI / -A)
#include <windows.h>

BOOL VerifyVersionInfoA(
    OSVERSIONINFOEXA* lpVersionInformation,
    VER_FLAGS dwTypeMask,
    ULONGLONG dwlConditionMask
);

パラメーター

名前方向説明
lpVersionInformationOSVERSIONINFOEXA*inout

比較するオペレーティングシステムのバージョン要件を格納した OSVERSIONINFOEX 構造体へのポインターです。dwTypeMask パラメーターは、この構造体のうち比較対象となる情報を持つメンバーを示します。

この構造体の dwOSVersionInfoSize メンバーには sizeof(OSVERSIONINFOEX) を設定する必要があります。また、dwTypeMask で示されるメンバーには有効なデータを指定する必要があります。この関数は、対応する dwTypeMask ビットが設定されていない構造体メンバーを無視します。

dwTypeMaskVER_FLAGSin

テスト対象となる OSVERSIONINFOEX 構造体のメンバーを示すマスクです。このパラメーターには、次の値を 1 つ以上指定できます。

意味
VER_BUILDNUMBER
0x0000004
dwBuildNumber
VER_MAJORVERSION
0x0000002
dwMajorVersion

メジャーバージョンをテストする場合は、マイナーバージョンおよびサービスパックのメジャー/マイナーバージョンも併せてテストする必要があります。

VER_MINORVERSION
0x0000001
dwMinorVersion
VER_PLATFORMID
0x0000008
dwPlatformId
VER_SERVICEPACKMAJOR
0x0000020
wServicePackMajor
VER_SERVICEPACKMINOR
0x0000010
wServicePackMinor
VER_SUITENAME
0x0000040
wSuiteMask
VER_PRODUCT_TYPE
0x0000080
wProductType
dwlConditionMaskULONGLONGin比較する各 lpVersionInfo メンバーに使用する比較の種類です。この値を作成するには、比較対象となる OSVERSIONINFOEX メンバーごとに VerSetConditionMask 関数または VER_SET_CONDITION マクロを 1 回ずつ呼び出します。

戻り値の型: BOOL

公式ドキュメント

一連のオペレーティングシステムのバージョン要件を、現在実行中のシステムのバージョンに対応する値と比較します。(ANSI)

戻り値

現在実行中のオペレーティングシステムが指定された要件を満たす場合、戻り値は 0 以外の値になります。

現在のシステムが要件を満たさない場合、戻り値は 0 になり、 GetLastErrorERROR_OLD_WIN_VERSION を返します。

関数が失敗した場合、戻り値は 0 になり、GetLastErrorERROR_OLD_WIN_VERSION 以外のエラーコードを返します。

解説(Remarks)

VerifyVersionInfo 関数は、現在実行中のオペレーティングシステムのバージョン情報を取得し、lpVersionInfo 構造体の有効なメンバーと比較します。これにより、必要とされる一連のオペレーティングシステムのバージョン条件が満たされているかどうかを容易に判定できます。独自の比較を行うために GetVersionEx 関数を呼び出すよりも、 VerifyVersionInfo を使用することが推奨されます。

通常、 VerifyVersionInfo はすべての指定されたテストが成功した場合にのみ 0 以外の値を返します。ただし、メジャーバージョン、マイナーバージョン、サービスパックバージョンは、オペレーティングシステムのバージョンがこれらの値の組み合わせであるため、階層的にテストされます。メジャーバージョンに条件が存在する場合、その条件はマイナーバージョンおよびサービスパックバージョンに指定された条件に優先します。(メジャーバージョンが 5 より大きく、かつマイナーバージョンが 1 以下であるというテストはできません。そのようなテストを指定すると、関数はメジャーバージョンに対して「より大きい」演算を行うため、要求をマイナーバージョンが 1 より大きいというテストに変更します。)

関数はこれらの値を、メジャーバージョン、マイナーバージョン、サービスパックバージョンの順にテストします。関数は値が等しい間はテストを続け、いずれかの値が指定された条件を満たさなくなった時点で停止します。たとえば、バージョン 5.1 サービスパック 1 以上のシステムをテストする場合、現在のバージョンが 6.0 であればテストは成功します。(メジャーバージョンが指定されたバージョンより大きいため、テストはそこで停止します。)同様に、バージョン 5.1 サービスパック 1 以上のシステムをテストする場合、現在のバージョンが 5.2 であればテストは成功します。(マイナーバージョンが指定されたバージョンより大きいため、テストはそこで停止します。)しかし、バージョン 5.1 サービスパック 1 以上のシステムをテストする場合、現在のバージョンが 5.0 サービスパック 2 であればテストは失敗します。(マイナーバージョンが指定されたバージョンより大きくないため、テストはそこで停止します。)

システムバージョンの範囲を検証するには、 VerifyVersionInfo を 2 回呼び出す必要があります。たとえば、システムバージョンが 5.0 より大きく 5.1 以下であることを検証するには、まず VerifyVersionInfo を呼び出してメジャーバージョンが 5 でマイナーバージョンが 0 より大きいことをテストし、次に再度 VerifyVersionInfo を呼び出してメジャーバージョンが 5 でマイナーバージョンが 1 以下であることをテストします。

現在のオペレーティングシステムを識別することは、特定のオペレーティングシステムの機能が存在するかどうかを判定する最善の方法ではないのが通常です。これは、再頒布可能 DLL によってオペレーティングシステムに新しい機能が追加されている場合があるためです。オペレーティングシステムのプラットフォームやバージョン番号を判定するために GetVersionEx を使用するのではなく、機能そのものの有無をテストしてください。詳細については、 Operating System Version を参照してください。

現在のオペレーティングシステムが Windows の Media Center 版または Tablet PC 版のいずれかであるかどうかを検証するには、GetSystemMetrics を呼び出してください。

Windows 10: lpVersionInfo パラメーターが Windows 8.1 または Windows 10 を指定するように設定されている場合、VerifyVersionInfo は、Windows 8.1 または Windows 10 用の互換性マニフェストを持たないアプリケーションから呼び出されると、現在のオペレーティングシステムのバージョンが実際に Windows 8.1 または Windows 10 であっても false を返します。具体的には、VerifyVersionInfo は次の動作をします。

Version Helper 関数VerifyVersionInfo 関数を使用するため、IsWindows8Point1OrGreater および IsWindows10OrGreater の動作も、マニフェストの有無とその内容によって同様に影響を受けます。

アプリケーションを Windows 8.1 または Windows 10 向けにマニフェスト化する方法については、Targeting your application for Windows を参照してください。

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

メモ

winbase.h ヘッダーは VerifyVersionInfo を、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)

各言語での呼び出し定義

// KERNEL32.dll  (ANSI / -A)
#include <windows.h>

BOOL VerifyVersionInfoA(
    OSVERSIONINFOEXA* lpVersionInformation,
    VER_FLAGS dwTypeMask,
    ULONGLONG dwlConditionMask
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
static extern bool VerifyVersionInfoA(
    IntPtr lpVersionInformation,   // OSVERSIONINFOEXA* in/out
    uint dwTypeMask,   // VER_FLAGS
    ulong dwlConditionMask   // ULONGLONG
);
<DllImport("KERNEL32.dll", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function VerifyVersionInfoA(
    lpVersionInformation As IntPtr,   ' OSVERSIONINFOEXA* in/out
    dwTypeMask As UInteger,   ' VER_FLAGS
    dwlConditionMask As ULong   ' ULONGLONG
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' lpVersionInformation : OSVERSIONINFOEXA* in/out
' dwTypeMask : VER_FLAGS
' dwlConditionMask : ULONGLONG
Declare PtrSafe Function VerifyVersionInfoA Lib "kernel32" ( _
    ByVal lpVersionInformation As LongPtr, _
    ByVal dwTypeMask As Long, _
    ByVal dwlConditionMask As LongLong) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

VerifyVersionInfoA = ctypes.windll.kernel32.VerifyVersionInfoA
VerifyVersionInfoA.restype = wintypes.BOOL
VerifyVersionInfoA.argtypes = [
    ctypes.c_void_p,  # lpVersionInformation : OSVERSIONINFOEXA* in/out
    wintypes.DWORD,  # dwTypeMask : VER_FLAGS
    ctypes.c_ulonglong,  # dwlConditionMask : ULONGLONG
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('KERNEL32.dll')
VerifyVersionInfoA = Fiddle::Function.new(
  lib['VerifyVersionInfoA'],
  [
    Fiddle::TYPE_VOIDP,  # lpVersionInformation : OSVERSIONINFOEXA* in/out
    -Fiddle::TYPE_INT,  # dwTypeMask : VER_FLAGS
    -Fiddle::TYPE_LONG_LONG,  # dwlConditionMask : ULONGLONG
  ],
  Fiddle::TYPE_INT)
#[link(name = "kernel32")]
extern "system" {
    fn VerifyVersionInfoA(
        lpVersionInformation: *mut OSVERSIONINFOEXA,  // OSVERSIONINFOEXA* in/out
        dwTypeMask: u32,  // VER_FLAGS
        dwlConditionMask: u64  // ULONGLONG
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
public static extern bool VerifyVersionInfoA(IntPtr lpVersionInformation, uint dwTypeMask, ulong dwlConditionMask);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_VerifyVersionInfoA' -Namespace Win32 -PassThru
# $api::VerifyVersionInfoA(lpVersionInformation, dwTypeMask, dwlConditionMask)
#uselib "KERNEL32.dll"
#func global VerifyVersionInfoA "VerifyVersionInfoA" sptr, sptr, sptr
; VerifyVersionInfoA varptr(lpVersionInformation), dwTypeMask, dwlConditionMask   ; 戻り値は stat
; lpVersionInformation : OSVERSIONINFOEXA* in/out -> "sptr"
; dwTypeMask : VER_FLAGS -> "sptr"
; dwlConditionMask : ULONGLONG -> "sptr"
; ※HSP3.7は int64 引数(64bit値渡し)に非対応です。
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "KERNEL32.dll"
#cfunc global VerifyVersionInfoA "VerifyVersionInfoA" var, int, int64
; res = VerifyVersionInfoA(lpVersionInformation, dwTypeMask, dwlConditionMask)
; lpVersionInformation : OSVERSIONINFOEXA* in/out -> "var"
; dwTypeMask : VER_FLAGS -> "int"
; dwlConditionMask : ULONGLONG -> "int64"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
; ※int64 引数の DLL 値渡しは x64 ランタイム(hsp3_64)のみ対応(x86 は未対応)。
出力引数:
; BOOL VerifyVersionInfoA(OSVERSIONINFOEXA* lpVersionInformation, VER_FLAGS dwTypeMask, ULONGLONG dwlConditionMask)
#uselib "KERNEL32.dll"
#cfunc global VerifyVersionInfoA "VerifyVersionInfoA" var, int, int64
; res = VerifyVersionInfoA(lpVersionInformation, dwTypeMask, dwlConditionMask)
; lpVersionInformation : OSVERSIONINFOEXA* in/out -> "var"
; dwTypeMask : VER_FLAGS -> "int"
; dwlConditionMask : ULONGLONG -> "int64"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procVerifyVersionInfoA = kernel32.NewProc("VerifyVersionInfoA")
)

// lpVersionInformation (OSVERSIONINFOEXA* in/out), dwTypeMask (VER_FLAGS), dwlConditionMask (ULONGLONG)
r1, _, err := procVerifyVersionInfoA.Call(
	uintptr(lpVersionInformation),
	uintptr(dwTypeMask),
	uintptr(dwlConditionMask),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function VerifyVersionInfoA(
  lpVersionInformation: Pointer;   // OSVERSIONINFOEXA* in/out
  dwTypeMask: DWORD;   // VER_FLAGS
  dwlConditionMask: UInt64   // ULONGLONG
): BOOL; stdcall;
  external 'KERNEL32.dll' name 'VerifyVersionInfoA';
result := DllCall("KERNEL32\VerifyVersionInfoA"
    , "Ptr", lpVersionInformation   ; OSVERSIONINFOEXA* in/out
    , "UInt", dwTypeMask   ; VER_FLAGS
    , "Int64", dwlConditionMask   ; ULONGLONG
    , "Int")   ; return: BOOL
●VerifyVersionInfoA(lpVersionInformation, dwTypeMask, dwlConditionMask) = DLL("KERNEL32.dll", "bool VerifyVersionInfoA(void*, dword, qword)")
# 呼び出し: VerifyVersionInfoA(lpVersionInformation, dwTypeMask, dwlConditionMask)
# lpVersionInformation : OSVERSIONINFOEXA* in/out -> "void*"
# dwTypeMask : VER_FLAGS -> "dword"
# dwlConditionMask : ULONGLONG -> "qword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "kernel32" fn VerifyVersionInfoA(
    lpVersionInformation: [*c]OSVERSIONINFOEXA, // OSVERSIONINFOEXA* in/out
    dwTypeMask: u32, // VER_FLAGS
    dwlConditionMask: u64 // ULONGLONG
) callconv(std.os.windows.WINAPI) i32;
proc VerifyVersionInfoA(
    lpVersionInformation: ptr OSVERSIONINFOEXA,  # OSVERSIONINFOEXA* in/out
    dwTypeMask: uint32,  # VER_FLAGS
    dwlConditionMask: uint64  # ULONGLONG
): int32 {.importc: "VerifyVersionInfoA", stdcall, dynlib: "KERNEL32.dll".}
pragma(lib, "kernel32");
extern(Windows)
int VerifyVersionInfoA(
    OSVERSIONINFOEXA* lpVersionInformation,   // OSVERSIONINFOEXA* in/out
    uint dwTypeMask,   // VER_FLAGS
    ulong dwlConditionMask   // ULONGLONG
);
ccall((:VerifyVersionInfoA, "KERNEL32.dll"), stdcall, Int32,
      (Ptr{OSVERSIONINFOEXA}, UInt32, UInt64),
      lpVersionInformation, dwTypeMask, dwlConditionMask)
# lpVersionInformation : OSVERSIONINFOEXA* in/out -> Ptr{OSVERSIONINFOEXA}
# dwTypeMask : VER_FLAGS -> UInt32
# dwlConditionMask : ULONGLONG -> UInt64
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t VerifyVersionInfoA(
    void* lpVersionInformation,
    uint32_t dwTypeMask,
    uint64_t dwlConditionMask);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.VerifyVersionInfoA(lpVersionInformation, dwTypeMask, dwlConditionMask)
-- lpVersionInformation : OSVERSIONINFOEXA* in/out
-- dwTypeMask : VER_FLAGS
-- dwlConditionMask : ULONGLONG
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const VerifyVersionInfoA = lib.func('__stdcall', 'VerifyVersionInfoA', 'int32_t', ['void *', 'uint32_t', 'uint64_t']);
// VerifyVersionInfoA(lpVersionInformation, dwTypeMask, dwlConditionMask)
// lpVersionInformation : OSVERSIONINFOEXA* in/out -> 'void *'
// dwTypeMask : VER_FLAGS -> 'uint32_t'
// dwlConditionMask : ULONGLONG -> 'uint64_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("KERNEL32.dll", {
  VerifyVersionInfoA: { parameters: ["pointer", "u32", "u64"], result: "i32" },
});
// lib.symbols.VerifyVersionInfoA(lpVersionInformation, dwTypeMask, dwlConditionMask)
// lpVersionInformation : OSVERSIONINFOEXA* in/out -> "pointer"
// dwTypeMask : VER_FLAGS -> "u32"
// dwlConditionMask : ULONGLONG -> "u64"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t VerifyVersionInfoA(
    void* lpVersionInformation,
    uint32_t dwTypeMask,
    uint64_t dwlConditionMask);
C, "KERNEL32.dll");
// $ffi->VerifyVersionInfoA(lpVersionInformation, dwTypeMask, dwlConditionMask);
// lpVersionInformation : OSVERSIONINFOEXA* in/out
// dwTypeMask : VER_FLAGS
// dwlConditionMask : ULONGLONG
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Kernel32 extends StdCallLibrary {
    Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class, W32APIOptions.ASCII_OPTIONS);
    boolean VerifyVersionInfoA(
        Pointer lpVersionInformation,   // OSVERSIONINFOEXA* in/out
        int dwTypeMask,   // VER_FLAGS
        long dwlConditionMask   // ULONGLONG
    );
}
@[Link("kernel32")]
lib LibKERNEL32
  fun VerifyVersionInfoA = VerifyVersionInfoA(
    lpVersionInformation : OSVERSIONINFOEXA*,   # OSVERSIONINFOEXA* in/out
    dwTypeMask : UInt32,   # VER_FLAGS
    dwlConditionMask : UInt64   # ULONGLONG
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef VerifyVersionInfoANative = Int32 Function(Pointer<Void>, Uint32, Uint64);
typedef VerifyVersionInfoADart = int Function(Pointer<Void>, int, int);
final VerifyVersionInfoA = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<VerifyVersionInfoANative, VerifyVersionInfoADart>('VerifyVersionInfoA');
// lpVersionInformation : OSVERSIONINFOEXA* in/out -> Pointer<Void>
// dwTypeMask : VER_FLAGS -> Uint32
// dwlConditionMask : ULONGLONG -> Uint64
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function VerifyVersionInfoA(
  lpVersionInformation: Pointer;   // OSVERSIONINFOEXA* in/out
  dwTypeMask: DWORD;   // VER_FLAGS
  dwlConditionMask: UInt64   // ULONGLONG
): BOOL; stdcall;
  external 'KERNEL32.dll' name 'VerifyVersionInfoA';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "VerifyVersionInfoA"
  c_VerifyVersionInfoA :: Ptr () -> Word32 -> Word64 -> IO CInt
-- lpVersionInformation : OSVERSIONINFOEXA* in/out -> Ptr ()
-- dwTypeMask : VER_FLAGS -> Word32
-- dwlConditionMask : ULONGLONG -> Word64
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let verifyversioninfoa =
  foreign "VerifyVersionInfoA"
    ((ptr void) @-> uint32_t @-> uint64_t @-> returning int32_t)
(* lpVersionInformation : OSVERSIONINFOEXA* in/out -> (ptr void) *)
(* dwTypeMask : VER_FLAGS -> uint32_t *)
(* dwlConditionMask : ULONGLONG -> uint64_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

(cffi:defcfun ("VerifyVersionInfoA" verify-version-info-a :convention :stdcall) :int32
  (lp-version-information :pointer)   ; OSVERSIONINFOEXA* in/out
  (dw-type-mask :uint32)   ; VER_FLAGS
  (dwl-condition-mask :uint64))   ; ULONGLONG
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $VerifyVersionInfoA = Win32::API::More->new('KERNEL32',
    'BOOL VerifyVersionInfoA(LPVOID lpVersionInformation, DWORD dwTypeMask, UINT64 dwlConditionMask)');
# my $ret = $VerifyVersionInfoA->Call($lpVersionInformation, $dwTypeMask, $dwlConditionMask);
# lpVersionInformation : OSVERSIONINFOEXA* in/out -> LPVOID
# dwTypeMask : VER_FLAGS -> DWORD
# dwlConditionMask : ULONGLONG -> UINT64
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

文字セット違い
公式の関連項目
使用する型