Win32 API 日本語リファレンス
ホームDevices.DeviceAndDriverInstallation › CM_Is_Version_Available_Ex

CM_Is_Version_Available_Ex

関数
リモートマシンで指定バージョンが利用可能か判定する。
DLLCFGMGR32.dll呼出規約winapi対応OSWindows XP 以降

シグネチャ

// CFGMGR32.dll
#include <windows.h>

BOOL CM_Is_Version_Available_Ex(
    WORD wVersion,
    INT_PTR hMachine   // optional
);

パラメーター

名前方向説明
wVersionWORDinConfiguration Manager のバージョンを指定します。Configuration Manager のサポートされるバージョンは、オペレーティング システムのバージョンに直接対応します。メジャー バージョンは上位バイトで、マイナー バージョンは下位バイトで指定します。たとえば 0x0400 はバージョン 4.0 を指定し、これは Microsoft Windows NT 4.0 以降の Windows で既定でサポートされます。バージョン 0x0501 はバージョン 5.1 を指定し、これは Windows XP 以降の Windows でサポートされます。
hMachineINT_PTRinoptional

CM_Connect_Machine から返されたマシン ハンドルを指定します。

注意 この関数を使用してリモート コンピューターにアクセスすることは、Windows 8 および Windows Server 2012 以降ではサポートされていません。この機能は削除されています。

戻り値の型: BOOL

公式ドキュメント

CM_Is_Version_Available_Ex 関数は、Plug and Play (PNP) Configuration Manager DLL (Cfgmgr32.dll) の指定されたバージョンが、ローカルまたはリモートのコンピューターでサポートされているかどうかを示します。

戻り値

指定されたコンピューターに接続でき、かつそのコンピューターが指定されたバージョンをサポートしている場合、この関数は TRUE を返します。それ以外の場合は FALSE を返します。

解説(Remarks)

この関数を使用すると、Configuration Manager の指定されたバージョンがローカルまたはリモートのコンピューターでサポートされているかどうかを判断できます。指定されたバージョンがサポートされている場合、そのバージョンを含むそれ以前のすべてのバージョンがそのコンピューターでサポートされます。ローカル コンピューターが Configuration Manager の特定のバージョンをサポートしているかどうかを判断するには、CM_Is_Version_Available を使用することもできます。

リモート コンピューターにアクセスする機能は Windows 8 および Windows Server 2012 以降のオペレーティング システムで削除されているため、これらのバージョンの Windows で実行している場合はリモート コンピューターにアクセスできません。

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

各言語での呼び出し定義

// CFGMGR32.dll
#include <windows.h>

BOOL CM_Is_Version_Available_Ex(
    WORD wVersion,
    INT_PTR hMachine   // optional
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("CFGMGR32.dll", ExactSpelling = true)]
static extern bool CM_Is_Version_Available_Ex(
    ushort wVersion,   // WORD
    IntPtr hMachine   // INT_PTR optional
);
<DllImport("CFGMGR32.dll", ExactSpelling:=True)>
Public Shared Function CM_Is_Version_Available_Ex(
    wVersion As UShort,   ' WORD
    hMachine As IntPtr   ' INT_PTR optional
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' wVersion : WORD
' hMachine : INT_PTR optional
Declare PtrSafe Function CM_Is_Version_Available_Ex Lib "cfgmgr32" ( _
    ByVal wVersion As Integer, _
    ByVal hMachine As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

CM_Is_Version_Available_Ex = ctypes.windll.cfgmgr32.CM_Is_Version_Available_Ex
CM_Is_Version_Available_Ex.restype = wintypes.BOOL
CM_Is_Version_Available_Ex.argtypes = [
    ctypes.c_ushort,  # wVersion : WORD
    ctypes.c_ssize_t,  # hMachine : INT_PTR optional
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('CFGMGR32.dll')
CM_Is_Version_Available_Ex = Fiddle::Function.new(
  lib['CM_Is_Version_Available_Ex'],
  [
    -Fiddle::TYPE_SHORT,  # wVersion : WORD
    Fiddle::TYPE_INTPTR_T,  # hMachine : INT_PTR optional
  ],
  Fiddle::TYPE_INT)
#[link(name = "cfgmgr32")]
extern "system" {
    fn CM_Is_Version_Available_Ex(
        wVersion: u16,  // WORD
        hMachine: isize  // INT_PTR optional
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("CFGMGR32.dll")]
public static extern bool CM_Is_Version_Available_Ex(ushort wVersion, IntPtr hMachine);
"@
$api = Add-Type -MemberDefinition $sig -Name 'CFGMGR32_CM_Is_Version_Available_Ex' -Namespace Win32 -PassThru
# $api::CM_Is_Version_Available_Ex(wVersion, hMachine)
#uselib "CFGMGR32.dll"
#func global CM_Is_Version_Available_Ex "CM_Is_Version_Available_Ex" sptr, sptr
; CM_Is_Version_Available_Ex wVersion, hMachine   ; 戻り値は stat
; wVersion : WORD -> "sptr"
; hMachine : INT_PTR optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "CFGMGR32.dll"
#cfunc global CM_Is_Version_Available_Ex "CM_Is_Version_Available_Ex" int, sptr
; res = CM_Is_Version_Available_Ex(wVersion, hMachine)
; wVersion : WORD -> "int"
; hMachine : INT_PTR optional -> "sptr"
; BOOL CM_Is_Version_Available_Ex(WORD wVersion, INT_PTR hMachine)
#uselib "CFGMGR32.dll"
#cfunc global CM_Is_Version_Available_Ex "CM_Is_Version_Available_Ex" int, intptr
; res = CM_Is_Version_Available_Ex(wVersion, hMachine)
; wVersion : WORD -> "int"
; hMachine : INT_PTR optional -> "intptr"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	cfgmgr32 = windows.NewLazySystemDLL("CFGMGR32.dll")
	procCM_Is_Version_Available_Ex = cfgmgr32.NewProc("CM_Is_Version_Available_Ex")
)

// wVersion (WORD), hMachine (INT_PTR optional)
r1, _, err := procCM_Is_Version_Available_Ex.Call(
	uintptr(wVersion),
	uintptr(hMachine),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function CM_Is_Version_Available_Ex(
  wVersion: Word;   // WORD
  hMachine: NativeInt   // INT_PTR optional
): BOOL; stdcall;
  external 'CFGMGR32.dll' name 'CM_Is_Version_Available_Ex';
result := DllCall("CFGMGR32\CM_Is_Version_Available_Ex"
    , "UShort", wVersion   ; WORD
    , "Ptr", hMachine   ; INT_PTR optional
    , "Int")   ; return: BOOL
●CM_Is_Version_Available_Ex(wVersion, hMachine) = DLL("CFGMGR32.dll", "bool CM_Is_Version_Available_Ex(int, int)")
# 呼び出し: CM_Is_Version_Available_Ex(wVersion, hMachine)
# wVersion : WORD -> "int"
# hMachine : INT_PTR optional -> "int"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "cfgmgr32" fn CM_Is_Version_Available_Ex(
    wVersion: u16, // WORD
    hMachine: isize // INT_PTR optional
) callconv(std.os.windows.WINAPI) i32;
proc CM_Is_Version_Available_Ex(
    wVersion: uint16,  # WORD
    hMachine: int  # INT_PTR optional
): int32 {.importc: "CM_Is_Version_Available_Ex", stdcall, dynlib: "CFGMGR32.dll".}
pragma(lib, "cfgmgr32");
extern(Windows)
int CM_Is_Version_Available_Ex(
    ushort wVersion,   // WORD
    ptrdiff_t hMachine   // INT_PTR optional
);
ccall((:CM_Is_Version_Available_Ex, "CFGMGR32.dll"), stdcall, Int32,
      (UInt16, Int),
      wVersion, hMachine)
# wVersion : WORD -> UInt16
# hMachine : INT_PTR optional -> Int
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t CM_Is_Version_Available_Ex(
    uint16_t wVersion,
    intptr_t hMachine);
]]
local cfgmgr32 = ffi.load("cfgmgr32")
-- cfgmgr32.CM_Is_Version_Available_Ex(wVersion, hMachine)
-- wVersion : WORD
-- hMachine : INT_PTR optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('CFGMGR32.dll');
const CM_Is_Version_Available_Ex = lib.func('__stdcall', 'CM_Is_Version_Available_Ex', 'int32_t', ['uint16_t', 'intptr_t']);
// CM_Is_Version_Available_Ex(wVersion, hMachine)
// wVersion : WORD -> 'uint16_t'
// hMachine : INT_PTR optional -> 'intptr_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("CFGMGR32.dll", {
  CM_Is_Version_Available_Ex: { parameters: ["u16", "isize"], result: "i32" },
});
// lib.symbols.CM_Is_Version_Available_Ex(wVersion, hMachine)
// wVersion : WORD -> "u16"
// hMachine : INT_PTR optional -> "isize"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t CM_Is_Version_Available_Ex(
    uint16_t wVersion,
    intptr_t hMachine);
C, "CFGMGR32.dll");
// $ffi->CM_Is_Version_Available_Ex(wVersion, hMachine);
// wVersion : WORD
// hMachine : INT_PTR optional
// 構造体/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 Cfgmgr32 extends StdCallLibrary {
    Cfgmgr32 INSTANCE = Native.load("cfgmgr32", Cfgmgr32.class);
    boolean CM_Is_Version_Available_Ex(
        short wVersion,   // WORD
        long hMachine   // INT_PTR optional
    );
}
@[Link("cfgmgr32")]
lib LibCFGMGR32
  fun CM_Is_Version_Available_Ex = CM_Is_Version_Available_Ex(
    wVersion : UInt16,   # WORD
    hMachine : LibC::SSizeT   # INT_PTR optional
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef CM_Is_Version_Available_ExNative = Int32 Function(Uint16, IntPtr);
typedef CM_Is_Version_Available_ExDart = int Function(int, int);
final CM_Is_Version_Available_Ex = DynamicLibrary.open('CFGMGR32.dll')
    .lookupFunction<CM_Is_Version_Available_ExNative, CM_Is_Version_Available_ExDart>('CM_Is_Version_Available_Ex');
// wVersion : WORD -> Uint16
// hMachine : INT_PTR optional -> IntPtr
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function CM_Is_Version_Available_Ex(
  wVersion: Word;   // WORD
  hMachine: NativeInt   // INT_PTR optional
): BOOL; stdcall;
  external 'CFGMGR32.dll' name 'CM_Is_Version_Available_Ex';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "CM_Is_Version_Available_Ex"
  c_CM_Is_Version_Available_Ex :: Word16 -> CIntPtr -> IO CInt
-- wVersion : WORD -> Word16
-- hMachine : INT_PTR optional -> CIntPtr
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let cm_is_version_available_ex =
  foreign "CM_Is_Version_Available_Ex"
    (uint16_t @-> intptr_t @-> returning int32_t)
(* wVersion : WORD -> uint16_t *)
(* hMachine : INT_PTR optional -> intptr_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library cfgmgr32 (t "CFGMGR32.dll"))
(cffi:use-foreign-library cfgmgr32)

(cffi:defcfun ("CM_Is_Version_Available_Ex" cm-is-version-available-ex :convention :stdcall) :int32
  (w-version :uint16)   ; WORD
  (h-machine :int64))   ; INT_PTR optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $CM_Is_Version_Available_Ex = Win32::API::More->new('CFGMGR32',
    'BOOL CM_Is_Version_Available_Ex(WORD wVersion, LPARAM hMachine)');
# my $ret = $CM_Is_Version_Available_Ex->Call($wVersion, $hMachine);
# wVersion : WORD -> WORD
# hMachine : INT_PTR optional -> LPARAM
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目