SetupGetInfDriverStoreLocationA
関数シグネチャ
// SETUPAPI.dll (ANSI / -A)
#include <windows.h>
BOOL SetupGetInfDriverStoreLocationA(
LPCSTR FileName,
SP_ALTPLATFORM_INFO_V2* AlternatePlatformInfo, // optional
LPCSTR LocaleName, // optional
LPSTR ReturnBuffer,
DWORD ReturnBufferSize,
DWORD* RequiredSize // optional
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| FileName | LPCSTR | in | システム INF ファイル ディレクトリ内の INF ファイルの名前 (省略可能で完全なディレクトリ パスを含む) を格納した、NULL 終端文字列へのポインターです。あるいは、このパラメーターは、ドライバー ストア内の INF ファイルの完全修飾ファイル名 (ディレクトリ パスとファイル名) を格納した NULL 終端文字列へのポインターです。 INF ファイルの指定方法の詳細については、後述の 解説 セクションを参照してください。 |
| AlternatePlatformInfo | SP_ALTPLATFORM_INFO_V2* | inoptional | システムでの使用のために予約されています。 |
| LocaleName | LPCSTR | inoptional | システムでの使用のために予約されています。 |
| ReturnBuffer | LPSTR | out | 指定された INF ファイルの完全修飾ファイル名を格納する NULL 終端文字列を、この関数が返すバッファーへのポインターです。このパラメーターには NULL を設定できます。サポートされる最大のパス サイズは MAX_PATH です。必要なバッファーのサイズを調べる方法については、後述の 解説 セクションを参照してください。 |
| ReturnBufferSize | DWORD | in | ReturnBuffer で指定されたバッファーのサイズ (文字数)。 |
| RequiredSize | DWORD* | outoptional | ReturnBuffer バッファーのサイズ (文字数) を受け取る DWORD 型の変数へのポインターです。このパラメーターは省略可能で、NULL を設定できます。 |
戻り値の型: BOOL
公式ドキュメント
SetupGetInfDriverStoreLocation 関数は、システム INF ファイル ディレクトリ内の指定された INF ファイル、またはドライバー ストア内の指定された INF ファイルに対応する、ドライバー ストア内の INF ファイルの完全修飾ファイル名 (ディレクトリ パスとファイル名) を取得します。(ANSI)
戻り値
SetupGetInfDriverStoreLocation が成功した場合、関数は TRUE を返します。それ以外の場合は FALSE を返します。拡張エラー情報を取得するには、GetLastError を呼び出します。
要求された INF ファイルの完全修飾ファイル名のサイズ (null 終端文字を含む文字数) が ReturnBufferSize より大きい場合、関数は失敗し、GetLastError の呼び出しは ERROR_INSUFFICIENT_BUFFER を返します。
解説(Remarks)
ドライバー ストア内の指定された INF ファイルの完全修飾ファイル名を格納するために必要な戻りバッファーのサイズを調べるには、ReturnBuffer に NULL、ReturnBufferSize に 0 を設定し、RequiredSize を指定して SetupGetInfDriverStoreLocation を呼び出します。SetupGetInfDriverStoreLocation は、必要なバッファー サイズを RequiredSize に返します。
デバイス インストールがドライバー パッケージをドライバー ストアにプレインストールするとき、ドライバー パッケージの INF ファイルのコピーが 2 つ作成されます。デバイス インストールは、一方のコピーをシステム INF ディレクトリにインストールし、その INF ファイルのコピーに OEMnnn.inf という形式の一意の公開ファイル名を割り当てます。デバイス インストールは、INF ファイルの 2 つ目のコピーをドライバー ストアにインストールし、そのコピーには元の INF ファイル名を割り当てます。
SetupGetInfDriverStoreLocation は、FileName で指定された INF ファイルに一致する INF ファイルがドライバー ストアに存在する場合、その完全修飾ファイル名を返します。Filename には、システム INF ディレクトリ内の INF ファイルのファイル名 (省略可能でディレクトリ パスを含む) を指定する必要があります。あるいは、Filename にはドライバー ストア内の INF ファイルの完全修飾ファイル名を指定する必要があります。
たとえば、あるドライバー パッケージの INF ファイルが Myinf.inf であり、このドライバー パッケージに対して、デバイス インストールがシステム INF ディレクトリ C:\Windows\inf に INF ファイル OEM1.inf をインストールしたとします。さらに、デバイス インストールが対応する INF ファイルのコピー C:\windows\system32\driverstore\filerepository\myinf_12345678\myinf.inf をドライバー ストアにインストールしたとします。この場合、FileName に OEM1.inf、C:\Windows\inf\OEM1.inf、または C:\windows\system32\driverstore\filerepository\myinf_12345678\myinf.inf のいずれかの文字列を指定すると、関数は C:\windows\system32\driverstore\filerepository\myinf_12345678\myinf.inf を返します。
クラス インストーラーおよびコインストーラーは、SetupGetInfDriverStoreLocation を使用して、ドライバー ストアにプレインストールされているドライバー パッケージ内のファイルにアクセスできます。ドライバー ストア内のドライバー パッケージのパスを調べるには、インストーラーは次の処理を行います。
- SetupDiGetDriverInfoDetail を呼び出して、ドライバーの SP_DRVINFO_DETAIL_DATA 構造体を取得します。この構造体の InfFileName メンバーには、システム INF ディレクトリ内のドライバー INF ファイルの完全修飾ファイル名が格納されています。
- SetupGetInfDriverStoreLocation を呼び出し、SetupDiGetDriverInfoDetail の呼び出しで取得したドライバー INF ファイルの完全修飾ファイル名を指定します。SetupGetInfDriverStoreLocation は、ドライバー ストア内のドライバー INF ファイルの完全修飾ファイル名を返します。この INF ファイルの完全修飾ファイル名のディレクトリ パス部分が、ドライバー パッケージのファイルのパスです。
setupapi.h ヘッダーは、SetupGetInfDriverStoreLocation を、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして定義しています。エンコード中立のエイリアスと、エンコード中立でないコードを混在させると、不一致が生じ、コンパイル エラーや実行時エラーの原因となる場合があります。詳細については、関数プロトタイプの規則を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// SETUPAPI.dll (ANSI / -A)
#include <windows.h>
BOOL SetupGetInfDriverStoreLocationA(
LPCSTR FileName,
SP_ALTPLATFORM_INFO_V2* AlternatePlatformInfo, // optional
LPCSTR LocaleName, // optional
LPSTR ReturnBuffer,
DWORD ReturnBufferSize,
DWORD* RequiredSize // optional
);[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("SETUPAPI.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
static extern bool SetupGetInfDriverStoreLocationA(
[MarshalAs(UnmanagedType.LPStr)] string FileName, // LPCSTR
IntPtr AlternatePlatformInfo, // SP_ALTPLATFORM_INFO_V2* optional
[MarshalAs(UnmanagedType.LPStr)] string LocaleName, // LPCSTR optional
[MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder ReturnBuffer, // LPSTR out
uint ReturnBufferSize, // DWORD
IntPtr RequiredSize // DWORD* optional, out
);<DllImport("SETUPAPI.dll", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function SetupGetInfDriverStoreLocationA(
<MarshalAs(UnmanagedType.LPStr)> FileName As String, ' LPCSTR
AlternatePlatformInfo As IntPtr, ' SP_ALTPLATFORM_INFO_V2* optional
<MarshalAs(UnmanagedType.LPStr)> LocaleName As String, ' LPCSTR optional
<MarshalAs(UnmanagedType.LPStr)> ReturnBuffer As System.Text.StringBuilder, ' LPSTR out
ReturnBufferSize As UInteger, ' DWORD
RequiredSize As IntPtr ' DWORD* optional, out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function' FileName : LPCSTR
' AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional
' LocaleName : LPCSTR optional
' ReturnBuffer : LPSTR out
' ReturnBufferSize : DWORD
' RequiredSize : DWORD* optional, out
Declare PtrSafe Function SetupGetInfDriverStoreLocationA Lib "setupapi" ( _
ByVal FileName As String, _
ByVal AlternatePlatformInfo As LongPtr, _
ByVal LocaleName As String, _
ByVal ReturnBuffer As String, _
ByVal ReturnBufferSize As Long, _
ByVal RequiredSize As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
SetupGetInfDriverStoreLocationA = ctypes.windll.setupapi.SetupGetInfDriverStoreLocationA
SetupGetInfDriverStoreLocationA.restype = wintypes.BOOL
SetupGetInfDriverStoreLocationA.argtypes = [
wintypes.LPCSTR, # FileName : LPCSTR
ctypes.c_void_p, # AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional
wintypes.LPCSTR, # LocaleName : LPCSTR optional
wintypes.LPSTR, # ReturnBuffer : LPSTR 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')
SetupGetInfDriverStoreLocationA = Fiddle::Function.new(
lib['SetupGetInfDriverStoreLocationA'],
[
Fiddle::TYPE_VOIDP, # FileName : LPCSTR
Fiddle::TYPE_VOIDP, # AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional
Fiddle::TYPE_VOIDP, # LocaleName : LPCSTR optional
Fiddle::TYPE_VOIDP, # ReturnBuffer : LPSTR out
-Fiddle::TYPE_INT, # ReturnBufferSize : DWORD
Fiddle::TYPE_VOIDP, # RequiredSize : DWORD* optional, out
],
Fiddle::TYPE_INT)#[link(name = "setupapi")]
extern "system" {
fn SetupGetInfDriverStoreLocationA(
FileName: *const u8, // LPCSTR
AlternatePlatformInfo: *mut SP_ALTPLATFORM_INFO_V2, // SP_ALTPLATFORM_INFO_V2* optional
LocaleName: *const u8, // LPCSTR optional
ReturnBuffer: *mut u8, // LPSTR 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.Ansi, SetLastError = true)]
public static extern bool SetupGetInfDriverStoreLocationA([MarshalAs(UnmanagedType.LPStr)] string FileName, IntPtr AlternatePlatformInfo, [MarshalAs(UnmanagedType.LPStr)] string LocaleName, [MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder ReturnBuffer, uint ReturnBufferSize, IntPtr RequiredSize);
"@
$api = Add-Type -MemberDefinition $sig -Name 'SETUPAPI_SetupGetInfDriverStoreLocationA' -Namespace Win32 -PassThru
# $api::SetupGetInfDriverStoreLocationA(FileName, AlternatePlatformInfo, LocaleName, ReturnBuffer, ReturnBufferSize, RequiredSize)#uselib "SETUPAPI.dll"
#func global SetupGetInfDriverStoreLocationA "SetupGetInfDriverStoreLocationA" sptr, sptr, sptr, sptr, sptr, sptr
; SetupGetInfDriverStoreLocationA FileName, varptr(AlternatePlatformInfo), LocaleName, varptr(ReturnBuffer), ReturnBufferSize, varptr(RequiredSize) ; 戻り値は stat
; FileName : LPCSTR -> "sptr"
; AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional -> "sptr"
; LocaleName : LPCSTR optional -> "sptr"
; ReturnBuffer : LPSTR out -> "sptr"
; ReturnBufferSize : DWORD -> "sptr"
; RequiredSize : DWORD* optional, out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "SETUPAPI.dll" #cfunc global SetupGetInfDriverStoreLocationA "SetupGetInfDriverStoreLocationA" str, var, str, var, int, var ; res = SetupGetInfDriverStoreLocationA(FileName, AlternatePlatformInfo, LocaleName, ReturnBuffer, ReturnBufferSize, RequiredSize) ; FileName : LPCSTR -> "str" ; AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional -> "var" ; LocaleName : LPCSTR optional -> "str" ; ReturnBuffer : LPSTR out -> "var" ; ReturnBufferSize : DWORD -> "int" ; RequiredSize : DWORD* optional, out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "SETUPAPI.dll" #cfunc global SetupGetInfDriverStoreLocationA "SetupGetInfDriverStoreLocationA" str, sptr, str, sptr, int, sptr ; res = SetupGetInfDriverStoreLocationA(FileName, varptr(AlternatePlatformInfo), LocaleName, varptr(ReturnBuffer), ReturnBufferSize, varptr(RequiredSize)) ; FileName : LPCSTR -> "str" ; AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional -> "sptr" ; LocaleName : LPCSTR optional -> "str" ; ReturnBuffer : LPSTR out -> "sptr" ; ReturnBufferSize : DWORD -> "int" ; RequiredSize : DWORD* optional, out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; BOOL SetupGetInfDriverStoreLocationA(LPCSTR FileName, SP_ALTPLATFORM_INFO_V2* AlternatePlatformInfo, LPCSTR LocaleName, LPSTR ReturnBuffer, DWORD ReturnBufferSize, DWORD* RequiredSize) #uselib "SETUPAPI.dll" #cfunc global SetupGetInfDriverStoreLocationA "SetupGetInfDriverStoreLocationA" str, var, str, var, int, var ; res = SetupGetInfDriverStoreLocationA(FileName, AlternatePlatformInfo, LocaleName, ReturnBuffer, ReturnBufferSize, RequiredSize) ; FileName : LPCSTR -> "str" ; AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional -> "var" ; LocaleName : LPCSTR optional -> "str" ; ReturnBuffer : LPSTR out -> "var" ; ReturnBufferSize : DWORD -> "int" ; RequiredSize : DWORD* optional, out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; BOOL SetupGetInfDriverStoreLocationA(LPCSTR FileName, SP_ALTPLATFORM_INFO_V2* AlternatePlatformInfo, LPCSTR LocaleName, LPSTR ReturnBuffer, DWORD ReturnBufferSize, DWORD* RequiredSize) #uselib "SETUPAPI.dll" #cfunc global SetupGetInfDriverStoreLocationA "SetupGetInfDriverStoreLocationA" str, intptr, str, intptr, int, intptr ; res = SetupGetInfDriverStoreLocationA(FileName, varptr(AlternatePlatformInfo), LocaleName, varptr(ReturnBuffer), ReturnBufferSize, varptr(RequiredSize)) ; FileName : LPCSTR -> "str" ; AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional -> "intptr" ; LocaleName : LPCSTR optional -> "str" ; ReturnBuffer : LPSTR 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")
procSetupGetInfDriverStoreLocationA = setupapi.NewProc("SetupGetInfDriverStoreLocationA")
)
// FileName (LPCSTR), AlternatePlatformInfo (SP_ALTPLATFORM_INFO_V2* optional), LocaleName (LPCSTR optional), ReturnBuffer (LPSTR out), ReturnBufferSize (DWORD), RequiredSize (DWORD* optional, out)
r1, _, err := procSetupGetInfDriverStoreLocationA.Call(
uintptr(unsafe.Pointer(windows.BytePtrFromString(FileName))),
uintptr(AlternatePlatformInfo),
uintptr(unsafe.Pointer(windows.BytePtrFromString(LocaleName))),
uintptr(ReturnBuffer),
uintptr(ReturnBufferSize),
uintptr(RequiredSize),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // BOOLfunction SetupGetInfDriverStoreLocationA(
FileName: PAnsiChar; // LPCSTR
AlternatePlatformInfo: Pointer; // SP_ALTPLATFORM_INFO_V2* optional
LocaleName: PAnsiChar; // LPCSTR optional
ReturnBuffer: PAnsiChar; // LPSTR out
ReturnBufferSize: DWORD; // DWORD
RequiredSize: Pointer // DWORD* optional, out
): BOOL; stdcall;
external 'SETUPAPI.dll' name 'SetupGetInfDriverStoreLocationA';result := DllCall("SETUPAPI\SetupGetInfDriverStoreLocationA"
, "AStr", FileName ; LPCSTR
, "Ptr", AlternatePlatformInfo ; SP_ALTPLATFORM_INFO_V2* optional
, "AStr", LocaleName ; LPCSTR optional
, "Ptr", ReturnBuffer ; LPSTR out
, "UInt", ReturnBufferSize ; DWORD
, "Ptr", RequiredSize ; DWORD* optional, out
, "Int") ; return: BOOL●SetupGetInfDriverStoreLocationA(FileName, AlternatePlatformInfo, LocaleName, ReturnBuffer, ReturnBufferSize, RequiredSize) = DLL("SETUPAPI.dll", "bool SetupGetInfDriverStoreLocationA(char*, void*, char*, char*, dword, void*)")
# 呼び出し: SetupGetInfDriverStoreLocationA(FileName, AlternatePlatformInfo, LocaleName, ReturnBuffer, ReturnBufferSize, RequiredSize)
# FileName : LPCSTR -> "char*"
# AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional -> "void*"
# LocaleName : LPCSTR optional -> "char*"
# ReturnBuffer : LPSTR out -> "char*"
# ReturnBufferSize : DWORD -> "dword"
# RequiredSize : DWORD* optional, out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "setupapi" fn SetupGetInfDriverStoreLocationA(
FileName: [*c]const u8, // LPCSTR
AlternatePlatformInfo: [*c]SP_ALTPLATFORM_INFO_V2, // SP_ALTPLATFORM_INFO_V2* optional
LocaleName: [*c]const u8, // LPCSTR optional
ReturnBuffer: [*c]u8, // LPSTR out
ReturnBufferSize: u32, // DWORD
RequiredSize: [*c]u32 // DWORD* optional, out
) callconv(std.os.windows.WINAPI) i32;proc SetupGetInfDriverStoreLocationA(
FileName: cstring, # LPCSTR
AlternatePlatformInfo: ptr SP_ALTPLATFORM_INFO_V2, # SP_ALTPLATFORM_INFO_V2* optional
LocaleName: cstring, # LPCSTR optional
ReturnBuffer: ptr char, # LPSTR out
ReturnBufferSize: uint32, # DWORD
RequiredSize: ptr uint32 # DWORD* optional, out
): int32 {.importc: "SetupGetInfDriverStoreLocationA", stdcall, dynlib: "SETUPAPI.dll".}pragma(lib, "setupapi");
extern(Windows)
int SetupGetInfDriverStoreLocationA(
const(char)* FileName, // LPCSTR
SP_ALTPLATFORM_INFO_V2* AlternatePlatformInfo, // SP_ALTPLATFORM_INFO_V2* optional
const(char)* LocaleName, // LPCSTR optional
char* ReturnBuffer, // LPSTR out
uint ReturnBufferSize, // DWORD
uint* RequiredSize // DWORD* optional, out
);ccall((:SetupGetInfDriverStoreLocationA, "SETUPAPI.dll"), stdcall, Int32,
(Cstring, Ptr{SP_ALTPLATFORM_INFO_V2}, Cstring, Ptr{UInt8}, UInt32, Ptr{UInt32}),
FileName, AlternatePlatformInfo, LocaleName, ReturnBuffer, ReturnBufferSize, RequiredSize)
# FileName : LPCSTR -> Cstring
# AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional -> Ptr{SP_ALTPLATFORM_INFO_V2}
# LocaleName : LPCSTR optional -> Cstring
# ReturnBuffer : LPSTR out -> Ptr{UInt8}
# ReturnBufferSize : DWORD -> UInt32
# RequiredSize : DWORD* optional, out -> Ptr{UInt32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t SetupGetInfDriverStoreLocationA(
const char* FileName,
void* AlternatePlatformInfo,
const char* LocaleName,
char* ReturnBuffer,
uint32_t ReturnBufferSize,
uint32_t* RequiredSize);
]]
local setupapi = ffi.load("setupapi")
-- setupapi.SetupGetInfDriverStoreLocationA(FileName, AlternatePlatformInfo, LocaleName, ReturnBuffer, ReturnBufferSize, RequiredSize)
-- FileName : LPCSTR
-- AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional
-- LocaleName : LPCSTR optional
-- ReturnBuffer : LPSTR out
-- ReturnBufferSize : DWORD
-- RequiredSize : DWORD* optional, out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('SETUPAPI.dll');
const SetupGetInfDriverStoreLocationA = lib.func('__stdcall', 'SetupGetInfDriverStoreLocationA', 'int32_t', ['str', 'void *', 'str', 'char *', 'uint32_t', 'uint32_t *']);
// SetupGetInfDriverStoreLocationA(FileName, AlternatePlatformInfo, LocaleName, ReturnBuffer, ReturnBufferSize, RequiredSize)
// FileName : LPCSTR -> 'str'
// AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional -> 'void *'
// LocaleName : LPCSTR optional -> 'str'
// ReturnBuffer : LPSTR out -> 'char *'
// ReturnBufferSize : DWORD -> 'uint32_t'
// RequiredSize : DWORD* optional, out -> 'uint32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("SETUPAPI.dll", {
SetupGetInfDriverStoreLocationA: { parameters: ["buffer", "pointer", "buffer", "buffer", "u32", "pointer"], result: "i32" },
});
// lib.symbols.SetupGetInfDriverStoreLocationA(FileName, AlternatePlatformInfo, LocaleName, ReturnBuffer, ReturnBufferSize, RequiredSize)
// FileName : LPCSTR -> "buffer"
// AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional -> "pointer"
// LocaleName : LPCSTR optional -> "buffer"
// ReturnBuffer : LPSTR out -> "buffer"
// ReturnBufferSize : DWORD -> "u32"
// RequiredSize : DWORD* optional, out -> "pointer"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t SetupGetInfDriverStoreLocationA(
const char* FileName,
void* AlternatePlatformInfo,
const char* LocaleName,
char* ReturnBuffer,
uint32_t ReturnBufferSize,
uint32_t* RequiredSize);
C, "SETUPAPI.dll");
// $ffi->SetupGetInfDriverStoreLocationA(FileName, AlternatePlatformInfo, LocaleName, ReturnBuffer, ReturnBufferSize, RequiredSize);
// FileName : LPCSTR
// AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional
// LocaleName : LPCSTR optional
// ReturnBuffer : LPSTR 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.ASCII_OPTIONS);
boolean SetupGetInfDriverStoreLocationA(
String FileName, // LPCSTR
Pointer AlternatePlatformInfo, // SP_ALTPLATFORM_INFO_V2* optional
String LocaleName, // LPCSTR optional
byte[] ReturnBuffer, // LPSTR out
int ReturnBufferSize, // DWORD
IntByReference RequiredSize // DWORD* optional, out
);
}@[Link("setupapi")]
lib LibSETUPAPI
fun SetupGetInfDriverStoreLocationA = SetupGetInfDriverStoreLocationA(
FileName : UInt8*, # LPCSTR
AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2*, # SP_ALTPLATFORM_INFO_V2* optional
LocaleName : UInt8*, # LPCSTR optional
ReturnBuffer : UInt8*, # LPSTR 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 SetupGetInfDriverStoreLocationANative = Int32 Function(Pointer<Utf8>, Pointer<Void>, Pointer<Utf8>, Pointer<Utf8>, Uint32, Pointer<Uint32>);
typedef SetupGetInfDriverStoreLocationADart = int Function(Pointer<Utf8>, Pointer<Void>, Pointer<Utf8>, Pointer<Utf8>, int, Pointer<Uint32>);
final SetupGetInfDriverStoreLocationA = DynamicLibrary.open('SETUPAPI.dll')
.lookupFunction<SetupGetInfDriverStoreLocationANative, SetupGetInfDriverStoreLocationADart>('SetupGetInfDriverStoreLocationA');
// FileName : LPCSTR -> Pointer<Utf8>
// AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional -> Pointer<Void>
// LocaleName : LPCSTR optional -> Pointer<Utf8>
// ReturnBuffer : LPSTR out -> Pointer<Utf8>
// ReturnBufferSize : DWORD -> Uint32
// RequiredSize : DWORD* optional, out -> Pointer<Uint32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function SetupGetInfDriverStoreLocationA(
FileName: PAnsiChar; // LPCSTR
AlternatePlatformInfo: Pointer; // SP_ALTPLATFORM_INFO_V2* optional
LocaleName: PAnsiChar; // LPCSTR optional
ReturnBuffer: PAnsiChar; // LPSTR out
ReturnBufferSize: DWORD; // DWORD
RequiredSize: Pointer // DWORD* optional, out
): BOOL; stdcall;
external 'SETUPAPI.dll' name 'SetupGetInfDriverStoreLocationA';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "SetupGetInfDriverStoreLocationA"
c_SetupGetInfDriverStoreLocationA :: CString -> Ptr () -> CString -> CString -> Word32 -> Ptr Word32 -> IO CInt
-- FileName : LPCSTR -> CString
-- AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional -> Ptr ()
-- LocaleName : LPCSTR optional -> CString
-- ReturnBuffer : LPSTR out -> CString
-- ReturnBufferSize : DWORD -> Word32
-- RequiredSize : DWORD* optional, out -> Ptr Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let setupgetinfdriverstorelocationa =
foreign "SetupGetInfDriverStoreLocationA"
(string @-> (ptr void) @-> string @-> string @-> uint32_t @-> (ptr uint32_t) @-> returning int32_t)
(* FileName : LPCSTR -> string *)
(* AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional -> (ptr void) *)
(* LocaleName : LPCSTR optional -> string *)
(* ReturnBuffer : LPSTR out -> string *)
(* 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 ("SetupGetInfDriverStoreLocationA" setup-get-inf-driver-store-location-a :convention :stdcall) :int32
(file-name :string) ; LPCSTR
(alternate-platform-info :pointer) ; SP_ALTPLATFORM_INFO_V2* optional
(locale-name :string) ; LPCSTR optional
(return-buffer :pointer) ; LPSTR 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 $SetupGetInfDriverStoreLocationA = Win32::API::More->new('SETUPAPI',
'BOOL SetupGetInfDriverStoreLocationA(LPCSTR FileName, LPVOID AlternatePlatformInfo, LPCSTR LocaleName, LPSTR ReturnBuffer, DWORD ReturnBufferSize, LPVOID RequiredSize)');
# my $ret = $SetupGetInfDriverStoreLocationA->Call($FileName, $AlternatePlatformInfo, $LocaleName, $ReturnBuffer, $ReturnBufferSize, $RequiredSize);
# FileName : LPCSTR -> LPCSTR
# AlternatePlatformInfo : SP_ALTPLATFORM_INFO_V2* optional -> LPVOID
# LocaleName : LPCSTR optional -> LPCSTR
# ReturnBuffer : LPSTR out -> LPSTR
# ReturnBufferSize : DWORD -> DWORD
# RequiredSize : DWORD* optional, out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f SetupGetInfDriverStoreLocationW (Unicode版) — ドライバーストア内のINFファイルの場所を取得する(Unicode)。
- s SP_DRVINFO_DETAIL_DATA_A
- f SetupDiGetDriverInfoDetailA — 指定ドライバの詳細情報を取得する。
- f SetupGetInfPublishedNameA — ドライバーストア内のINFの公開名を取得する(ANSI)。