SetupGetInfPublishedNameW
関数シグネチャ
// SETUPAPI.dll (Unicode / -W)
#include <windows.h>
BOOL SetupGetInfPublishedNameW(
LPCWSTR DriverStoreLocation,
LPWSTR ReturnBuffer,
DWORD ReturnBufferSize,
DWORD* RequiredSize // optional
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| DriverStoreLocation | LPCWSTR | in | ドライバーストア内の INF ファイルの完全修飾ファイル名 (ディレクトリパスとファイル名) を格納した、NULL で終わる文字列へのポインター。あるいは、システム INF ファイルディレクトリ内の INF ファイルの名前 (および任意でフルディレクトリパス) を格納した、NULL で終わる文字列へのポインターを指定します。INF ファイルの指定方法の詳細については、後述の解説セクションを参照してください。 |
| ReturnBuffer | LPWSTR | out | SetupGetInfPublishedName が、システム INF ディレクトリ内の指定された INF ファイルの完全修飾ファイル名を格納した NULL で終わる文字列を返すバッファーへのポインター。パスの最大サイズは MAX_PATH です。このポインターには NULL を設定できます。戻り値用バッファーに必要なサイズを判断する方法については、後述の解説セクションを参照してください。 |
| ReturnBufferSize | DWORD | in | ReturnBuffer で指定したバッファーのサイズ (文字数単位)。 |
| RequiredSize | DWORD* | outoptional | ReturnBuffer バッファーのサイズ (文字数単位) を受け取る DWORD 型の変数へのポインター。このパラメーターは省略可能で、NULL を設定できます。 |
戻り値の型: BOOL
公式ドキュメント
SetupGetInfPublishedName 関数は、ドライバーストア内の指定した INF ファイル、またはシステム INF ファイルディレクトリ内の指定した INF ファイルに対応する、システム INF ファイルディレクトリ内の INF ファイルの完全修飾ファイル名 (ディレクトリパスとファイル名) を取得します。(Unicode)
戻り値
SetupGetInfPublishedName が成功した場合、この関数は TRUE を返します。それ以外の場合は FALSE を返します。拡張エラー情報を取得するには、GetLastError を呼び出します。
要求された INF ファイルの完全修飾ファイル名のサイズ (NULL 終端文字を含む文字数) が ReturnBufferSize より大きい場合、この関数は失敗し、GetLastError の呼び出しは ERROR_INSUFFICIENT_BUFFER を返します。
解説(Remarks)
システム INF ディレクトリ内の指定された INF ファイルの完全修飾ファイル名を格納するために必要な戻り値用バッファーのサイズを判断するには、ReturnBuffer に NULL、ReturnBufferSize にゼロを設定し、RequiredSize を指定して SetupGetInfPublishedName を呼び出します。SetupGetInfPublishedName は必要なバッファーサイズを RequiredSize に返します。
デバイスインストールがドライバーパッケージをドライバーストアにプレインストールするとき、ドライバーパッケージの INF ファイルのコピーが 2 つ作成されます。デバイスインストールは、一方のコピーをシステム INF ディレクトリに追加し、その INF ファイルのコピーに OEMnnn.inf 形式の一意の公開ファイル名を割り当てます。デバイスインストールは、INF ファイルの 2 つ目のコピーをドライバーストアに追加し、そのコピーには元の INF ファイル名を割り当てます。
SetupGetInfPublishedName は、DriverStoreLocation で指定された INF ファイルに一致するシステム INF ファイルディレクトリ内の INF ファイルが存在する場合、その完全修飾ファイル名を返します。DriverStoreLocation には、ドライバーストア内の INF ファイルの完全修飾ファイル名を指定するか、システム INF ディレクトリ内の INF ファイルのファイル名 (および任意でディレクトリパス) を指定する必要があります。たとえば、あるドライバーパッケージの INF ファイルが myinf.inf であり、このドライバーパッケージに対してデバイスインストールが INF ファイル OEM1.inf をシステム INF ディレクトリ C:\Windows\inf にインストールしたとします。さらに、デバイスインストールが対応する INF ファイルのコピー C:\windows\system32\driverstore\filerepository\myinf_12345678\myinf.inf をドライバーストアにインストールしたとします。この場合、DriverStoreLocation に次のいずれかの文字列が指定されると、この関数は C:\Windows\inf\OEM1.inf を返します: C:\windows\system32\driverstore\filerepository\myinf_12345678\myinf.inf、OEM1.inf、または C:\Windows\inf\OEM1.inf。
システム INF ファイルディレクトリ内の指定した INF ファイル、またはドライバーストア内の指定したファイルに対応する、ドライバーストア内の INF ファイルの完全修飾ファイル名を取得するには、SetupGetInfDriverStoreLocation 関数を呼び出します。
setupapi.h ヘッダーは SetupGetInfPublishedName を、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして定義しています。エンコーディング中立のエイリアスの使用と、エンコーディング中立でないコードを混在させると、不一致が生じてコンパイルエラーや実行時エラーの原因になることがあります。詳細については、関数プロトタイプの規則を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// SETUPAPI.dll (Unicode / -W)
#include <windows.h>
BOOL SetupGetInfPublishedNameW(
LPCWSTR DriverStoreLocation,
LPWSTR ReturnBuffer,
DWORD ReturnBufferSize,
DWORD* RequiredSize // optional
);[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("SETUPAPI.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
static extern bool SetupGetInfPublishedNameW(
[MarshalAs(UnmanagedType.LPWStr)] string DriverStoreLocation, // LPCWSTR
[MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder ReturnBuffer, // LPWSTR out
uint ReturnBufferSize, // DWORD
IntPtr RequiredSize // DWORD* optional, out
);<DllImport("SETUPAPI.dll", CharSet:=CharSet.Unicode, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function SetupGetInfPublishedNameW(
<MarshalAs(UnmanagedType.LPWStr)> DriverStoreLocation As String, ' LPCWSTR
<MarshalAs(UnmanagedType.LPWStr)> ReturnBuffer As System.Text.StringBuilder, ' LPWSTR out
ReturnBufferSize As UInteger, ' DWORD
RequiredSize As IntPtr ' DWORD* optional, out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function' DriverStoreLocation : LPCWSTR
' ReturnBuffer : LPWSTR out
' ReturnBufferSize : DWORD
' RequiredSize : DWORD* optional, out
Declare PtrSafe Function SetupGetInfPublishedNameW Lib "setupapi" ( _
ByVal DriverStoreLocation As LongPtr, _
ByVal ReturnBuffer As LongPtr, _
ByVal ReturnBufferSize As Long, _
ByVal RequiredSize As LongPtr) As Long
' Unicode(W): 文字列は ByVal As LongPtr とし StrPtr(unicodeStr) を渡す
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
SetupGetInfPublishedNameW = ctypes.windll.setupapi.SetupGetInfPublishedNameW
SetupGetInfPublishedNameW.restype = wintypes.BOOL
SetupGetInfPublishedNameW.argtypes = [
wintypes.LPCWSTR, # DriverStoreLocation : LPCWSTR
wintypes.LPWSTR, # ReturnBuffer : LPWSTR out
wintypes.DWORD, # ReturnBufferSize : DWORD
ctypes.POINTER(wintypes.DWORD), # RequiredSize : DWORD* optional, out
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('SETUPAPI.dll')
SetupGetInfPublishedNameW = Fiddle::Function.new(
lib['SetupGetInfPublishedNameW'],
[
Fiddle::TYPE_VOIDP, # DriverStoreLocation : LPCWSTR
Fiddle::TYPE_VOIDP, # ReturnBuffer : LPWSTR out
-Fiddle::TYPE_INT, # ReturnBufferSize : DWORD
Fiddle::TYPE_VOIDP, # RequiredSize : DWORD* optional, out
],
Fiddle::TYPE_INT)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"#[link(name = "setupapi")]
extern "system" {
fn SetupGetInfPublishedNameW(
DriverStoreLocation: *const u16, // LPCWSTR
ReturnBuffer: *mut u16, // LPWSTR out
ReturnBufferSize: u32, // DWORD
RequiredSize: *mut u32 // DWORD* optional, out
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("SETUPAPI.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool SetupGetInfPublishedNameW([MarshalAs(UnmanagedType.LPWStr)] string DriverStoreLocation, [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder ReturnBuffer, uint ReturnBufferSize, IntPtr RequiredSize);
"@
$api = Add-Type -MemberDefinition $sig -Name 'SETUPAPI_SetupGetInfPublishedNameW' -Namespace Win32 -PassThru
# $api::SetupGetInfPublishedNameW(DriverStoreLocation, ReturnBuffer, ReturnBufferSize, RequiredSize)#uselib "SETUPAPI.dll"
#func global SetupGetInfPublishedNameW "SetupGetInfPublishedNameW" wptr, wptr, wptr, wptr
; SetupGetInfPublishedNameW DriverStoreLocation, varptr(ReturnBuffer), ReturnBufferSize, varptr(RequiredSize) ; 戻り値は stat
; DriverStoreLocation : LPCWSTR -> "wptr"
; ReturnBuffer : LPWSTR out -> "wptr"
; ReturnBufferSize : DWORD -> "wptr"
; RequiredSize : DWORD* optional, out -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "SETUPAPI.dll" #cfunc global SetupGetInfPublishedNameW "SetupGetInfPublishedNameW" wstr, var, int, var ; res = SetupGetInfPublishedNameW(DriverStoreLocation, ReturnBuffer, ReturnBufferSize, RequiredSize) ; DriverStoreLocation : LPCWSTR -> "wstr" ; ReturnBuffer : LPWSTR out -> "var" ; ReturnBufferSize : DWORD -> "int" ; RequiredSize : DWORD* optional, out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "SETUPAPI.dll" #cfunc global SetupGetInfPublishedNameW "SetupGetInfPublishedNameW" wstr, sptr, int, sptr ; res = SetupGetInfPublishedNameW(DriverStoreLocation, varptr(ReturnBuffer), ReturnBufferSize, varptr(RequiredSize)) ; DriverStoreLocation : LPCWSTR -> "wstr" ; ReturnBuffer : LPWSTR out -> "sptr" ; ReturnBufferSize : DWORD -> "int" ; RequiredSize : DWORD* optional, out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; BOOL SetupGetInfPublishedNameW(LPCWSTR DriverStoreLocation, LPWSTR ReturnBuffer, DWORD ReturnBufferSize, DWORD* RequiredSize) #uselib "SETUPAPI.dll" #cfunc global SetupGetInfPublishedNameW "SetupGetInfPublishedNameW" wstr, var, int, var ; res = SetupGetInfPublishedNameW(DriverStoreLocation, ReturnBuffer, ReturnBufferSize, RequiredSize) ; DriverStoreLocation : LPCWSTR -> "wstr" ; ReturnBuffer : LPWSTR out -> "var" ; ReturnBufferSize : DWORD -> "int" ; RequiredSize : DWORD* optional, out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; BOOL SetupGetInfPublishedNameW(LPCWSTR DriverStoreLocation, LPWSTR ReturnBuffer, DWORD ReturnBufferSize, DWORD* RequiredSize) #uselib "SETUPAPI.dll" #cfunc global SetupGetInfPublishedNameW "SetupGetInfPublishedNameW" wstr, intptr, int, intptr ; res = SetupGetInfPublishedNameW(DriverStoreLocation, varptr(ReturnBuffer), ReturnBufferSize, varptr(RequiredSize)) ; DriverStoreLocation : LPCWSTR -> "wstr" ; ReturnBuffer : LPWSTR out -> "intptr" ; ReturnBufferSize : DWORD -> "int" ; RequiredSize : DWORD* optional, out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
setupapi = windows.NewLazySystemDLL("SETUPAPI.dll")
procSetupGetInfPublishedNameW = setupapi.NewProc("SetupGetInfPublishedNameW")
)
// DriverStoreLocation (LPCWSTR), ReturnBuffer (LPWSTR out), ReturnBufferSize (DWORD), RequiredSize (DWORD* optional, out)
r1, _, err := procSetupGetInfPublishedNameW.Call(
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(DriverStoreLocation))),
uintptr(ReturnBuffer),
uintptr(ReturnBufferSize),
uintptr(RequiredSize),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // BOOLfunction SetupGetInfPublishedNameW(
DriverStoreLocation: PWideChar; // LPCWSTR
ReturnBuffer: PWideChar; // LPWSTR out
ReturnBufferSize: DWORD; // DWORD
RequiredSize: Pointer // DWORD* optional, out
): BOOL; stdcall;
external 'SETUPAPI.dll' name 'SetupGetInfPublishedNameW';result := DllCall("SETUPAPI\SetupGetInfPublishedNameW"
, "WStr", DriverStoreLocation ; LPCWSTR
, "Ptr", ReturnBuffer ; LPWSTR out
, "UInt", ReturnBufferSize ; DWORD
, "Ptr", RequiredSize ; DWORD* optional, out
, "Int") ; return: BOOL●SetupGetInfPublishedNameW(DriverStoreLocation, ReturnBuffer, ReturnBufferSize, RequiredSize) = DLL("SETUPAPI.dll", "bool SetupGetInfPublishedNameW(char*, char*, dword, void*)")
# 呼び出し: SetupGetInfPublishedNameW(DriverStoreLocation, ReturnBuffer, ReturnBufferSize, RequiredSize)
# DriverStoreLocation : LPCWSTR -> "char*"
# ReturnBuffer : LPWSTR out -> "char*"
# ReturnBufferSize : DWORD -> "dword"
# RequiredSize : DWORD* optional, out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。const std = @import("std");
extern "setupapi" fn SetupGetInfPublishedNameW(
DriverStoreLocation: [*c]const u16, // LPCWSTR
ReturnBuffer: [*c]u16, // LPWSTR out
ReturnBufferSize: u32, // DWORD
RequiredSize: [*c]u32 // DWORD* optional, out
) callconv(std.os.windows.WINAPI) i32;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。proc SetupGetInfPublishedNameW(
DriverStoreLocation: WideCString, # LPCWSTR
ReturnBuffer: ptr uint16, # LPWSTR out
ReturnBufferSize: uint32, # DWORD
RequiredSize: ptr uint32 # DWORD* optional, out
): int32 {.importc: "SetupGetInfPublishedNameW", stdcall, dynlib: "SETUPAPI.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。pragma(lib, "setupapi");
extern(Windows)
int SetupGetInfPublishedNameW(
const(wchar)* DriverStoreLocation, // LPCWSTR
wchar* ReturnBuffer, // LPWSTR out
uint ReturnBufferSize, // DWORD
uint* RequiredSize // DWORD* optional, out
);ccall((:SetupGetInfPublishedNameW, "SETUPAPI.dll"), stdcall, Int32,
(Cwstring, Ptr{UInt16}, UInt32, Ptr{UInt32}),
DriverStoreLocation, ReturnBuffer, ReturnBufferSize, RequiredSize)
# DriverStoreLocation : LPCWSTR -> Cwstring
# ReturnBuffer : LPWSTR out -> Ptr{UInt16}
# ReturnBufferSize : DWORD -> UInt32
# RequiredSize : DWORD* optional, out -> Ptr{UInt32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。local ffi = require("ffi")
ffi.cdef[[
int32_t SetupGetInfPublishedNameW(
const uint16_t* DriverStoreLocation,
uint16_t* ReturnBuffer,
uint32_t ReturnBufferSize,
uint32_t* RequiredSize);
]]
local setupapi = ffi.load("setupapi")
-- setupapi.SetupGetInfPublishedNameW(DriverStoreLocation, ReturnBuffer, ReturnBufferSize, RequiredSize)
-- DriverStoreLocation : LPCWSTR
-- ReturnBuffer : LPWSTR out
-- ReturnBufferSize : DWORD
-- RequiredSize : DWORD* optional, out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
-- Unicode(-W): uint16_t* には UTF-16LE のバッファ(ffi.new("uint16_t[?]", ...))を渡す。const koffi = require('koffi');
const lib = koffi.load('SETUPAPI.dll');
const SetupGetInfPublishedNameW = lib.func('__stdcall', 'SetupGetInfPublishedNameW', 'int32_t', ['str16', 'uint16_t *', 'uint32_t', 'uint32_t *']);
// SetupGetInfPublishedNameW(DriverStoreLocation, ReturnBuffer, ReturnBufferSize, RequiredSize)
// DriverStoreLocation : LPCWSTR -> 'str16'
// ReturnBuffer : LPWSTR out -> 'uint16_t *'
// ReturnBufferSize : DWORD -> 'uint32_t'
// RequiredSize : DWORD* optional, out -> 'uint32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("SETUPAPI.dll", {
SetupGetInfPublishedNameW: { parameters: ["buffer", "buffer", "u32", "pointer"], result: "i32" },
});
// lib.symbols.SetupGetInfPublishedNameW(DriverStoreLocation, ReturnBuffer, ReturnBufferSize, RequiredSize)
// DriverStoreLocation : LPCWSTR -> "buffer"
// ReturnBuffer : LPWSTR out -> "buffer"
// ReturnBufferSize : DWORD -> "u32"
// RequiredSize : DWORD* optional, out -> "pointer"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t SetupGetInfPublishedNameW(
const uint16_t* DriverStoreLocation,
uint16_t* ReturnBuffer,
uint32_t ReturnBufferSize,
uint32_t* RequiredSize);
C, "SETUPAPI.dll");
// $ffi->SetupGetInfPublishedNameW(DriverStoreLocation, ReturnBuffer, ReturnBufferSize, RequiredSize);
// DriverStoreLocation : LPCWSTR
// ReturnBuffer : LPWSTR out
// ReturnBufferSize : DWORD
// RequiredSize : DWORD* optional, out
// 構造体/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 Setupapi extends StdCallLibrary {
Setupapi INSTANCE = Native.load("setupapi", Setupapi.class, W32APIOptions.UNICODE_OPTIONS);
boolean SetupGetInfPublishedNameW(
WString DriverStoreLocation, // LPCWSTR
char[] ReturnBuffer, // LPWSTR out
int ReturnBufferSize, // DWORD
IntByReference RequiredSize // DWORD* optional, out
);
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。@[Link("setupapi")]
lib LibSETUPAPI
fun SetupGetInfPublishedNameW = SetupGetInfPublishedNameW(
DriverStoreLocation : UInt16*, # LPCWSTR
ReturnBuffer : UInt16*, # LPWSTR out
ReturnBufferSize : UInt32, # DWORD
RequiredSize : UInt32* # DWORD* optional, out
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef SetupGetInfPublishedNameWNative = Int32 Function(Pointer<Utf16>, Pointer<Utf16>, Uint32, Pointer<Uint32>);
typedef SetupGetInfPublishedNameWDart = int Function(Pointer<Utf16>, Pointer<Utf16>, int, Pointer<Uint32>);
final SetupGetInfPublishedNameW = DynamicLibrary.open('SETUPAPI.dll')
.lookupFunction<SetupGetInfPublishedNameWNative, SetupGetInfPublishedNameWDart>('SetupGetInfPublishedNameW');
// DriverStoreLocation : LPCWSTR -> Pointer<Utf16>
// ReturnBuffer : LPWSTR out -> Pointer<Utf16>
// ReturnBufferSize : DWORD -> Uint32
// RequiredSize : DWORD* optional, out -> Pointer<Uint32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function SetupGetInfPublishedNameW(
DriverStoreLocation: PWideChar; // LPCWSTR
ReturnBuffer: PWideChar; // LPWSTR out
ReturnBufferSize: DWORD; // DWORD
RequiredSize: Pointer // DWORD* optional, out
): BOOL; stdcall;
external 'SETUPAPI.dll' name 'SetupGetInfPublishedNameW';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "SetupGetInfPublishedNameW"
c_SetupGetInfPublishedNameW :: CWString -> CWString -> Word32 -> Ptr Word32 -> IO CInt
-- DriverStoreLocation : LPCWSTR -> CWString
-- ReturnBuffer : LPWSTR out -> CWString
-- ReturnBufferSize : DWORD -> Word32
-- RequiredSize : DWORD* optional, out -> Ptr Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let setupgetinfpublishednamew =
foreign "SetupGetInfPublishedNameW"
((ptr uint16_t) @-> (ptr uint16_t) @-> uint32_t @-> (ptr uint32_t) @-> returning int32_t)
(* DriverStoreLocation : LPCWSTR -> (ptr uint16_t) *)
(* ReturnBuffer : LPWSTR out -> (ptr uint16_t) *)
(* ReturnBufferSize : DWORD -> uint32_t *)
(* RequiredSize : DWORD* optional, out -> (ptr uint32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library setupapi (t "SETUPAPI.dll"))
(cffi:use-foreign-library setupapi)
(cffi:defcfun ("SetupGetInfPublishedNameW" setup-get-inf-published-name-w :convention :stdcall) :int32
(driver-store-location (:string :encoding :utf-16le)) ; LPCWSTR
(return-buffer :pointer) ; LPWSTR out
(return-buffer-size :uint32) ; DWORD
(required-size :pointer)) ; DWORD* optional, out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $SetupGetInfPublishedNameW = Win32::API::More->new('SETUPAPI',
'BOOL SetupGetInfPublishedNameW(LPCWSTR DriverStoreLocation, LPWSTR ReturnBuffer, DWORD ReturnBufferSize, LPVOID RequiredSize)');
# my $ret = $SetupGetInfPublishedNameW->Call($DriverStoreLocation, $ReturnBuffer, $ReturnBufferSize, $RequiredSize);
# DriverStoreLocation : LPCWSTR -> LPCWSTR
# ReturnBuffer : LPWSTR out -> LPWSTR
# ReturnBufferSize : DWORD -> DWORD
# RequiredSize : DWORD* optional, out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。関連項目
- f SetupGetInfPublishedNameA (ANSI版) — ドライバーストア内のINFの公開名を取得する(ANSI)。
- f SetupGetInfDriverStoreLocationW — ドライバーストア内のINFファイルの場所を取得する(Unicode)。