ホーム › Storage.Cabinets › FDICreate
FDICreate
関数ファイル展開インターフェイス(FDI)のコンテキストを生成する。
シグネチャ
// Cabinet.dll
#include <windows.h>
void* FDICreate(
PFNALLOC pfnalloc,
PFNFREE pfnfree,
PFNOPEN pfnopen,
PFNREAD pfnread,
PFNWRITE pfnwrite,
PFNCLOSE pfnclose,
PFNSEEK pfnseek,
FDICREATE_CPU_TYPE cpuType,
ERF* perf
);パラメーター
| 名前 | 型 | 方向 |
|---|---|---|
| pfnalloc | PFNALLOC | in |
| pfnfree | PFNFREE | in |
| pfnopen | PFNOPEN | in |
| pfnread | PFNREAD | in |
| pfnwrite | PFNWRITE | in |
| pfnclose | PFNCLOSE | in |
| pfnseek | PFNSEEK | in |
| cpuType | FDICREATE_CPU_TYPE | in |
| perf | ERF* | inout |
戻り値の型: void*
各言語での呼び出し定義
// Cabinet.dll
#include <windows.h>
void* FDICreate(
PFNALLOC pfnalloc,
PFNFREE pfnfree,
PFNOPEN pfnopen,
PFNREAD pfnread,
PFNWRITE pfnwrite,
PFNCLOSE pfnclose,
PFNSEEK pfnseek,
FDICREATE_CPU_TYPE cpuType,
ERF* perf
);[DllImport("Cabinet.dll", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr FDICreate(
IntPtr pfnalloc, // PFNALLOC
IntPtr pfnfree, // PFNFREE
IntPtr pfnopen, // PFNOPEN
IntPtr pfnread, // PFNREAD
IntPtr pfnwrite, // PFNWRITE
IntPtr pfnclose, // PFNCLOSE
IntPtr pfnseek, // PFNSEEK
int cpuType, // FDICREATE_CPU_TYPE
IntPtr perf // ERF* in/out
);<DllImport("Cabinet.dll", ExactSpelling:=True, CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function FDICreate(
pfnalloc As IntPtr, ' PFNALLOC
pfnfree As IntPtr, ' PFNFREE
pfnopen As IntPtr, ' PFNOPEN
pfnread As IntPtr, ' PFNREAD
pfnwrite As IntPtr, ' PFNWRITE
pfnclose As IntPtr, ' PFNCLOSE
pfnseek As IntPtr, ' PFNSEEK
cpuType As Integer, ' FDICREATE_CPU_TYPE
perf As IntPtr ' ERF* in/out
) As IntPtr
End Function' pfnalloc : PFNALLOC
' pfnfree : PFNFREE
' pfnopen : PFNOPEN
' pfnread : PFNREAD
' pfnwrite : PFNWRITE
' pfnclose : PFNCLOSE
' pfnseek : PFNSEEK
' cpuType : FDICREATE_CPU_TYPE
' perf : ERF* in/out
Declare PtrSafe Function FDICreate Lib "cabinet" ( _
ByVal pfnalloc As LongPtr, _
ByVal pfnfree As LongPtr, _
ByVal pfnopen As LongPtr, _
ByVal pfnread As LongPtr, _
ByVal pfnwrite As LongPtr, _
ByVal pfnclose As LongPtr, _
ByVal pfnseek As LongPtr, _
ByVal cpuType As Long, _
ByVal perf As LongPtr) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
FDICreate = ctypes.cdll.cabinet.FDICreate
FDICreate.restype = ctypes.c_void_p
FDICreate.argtypes = [
ctypes.c_void_p, # pfnalloc : PFNALLOC
ctypes.c_void_p, # pfnfree : PFNFREE
ctypes.c_void_p, # pfnopen : PFNOPEN
ctypes.c_void_p, # pfnread : PFNREAD
ctypes.c_void_p, # pfnwrite : PFNWRITE
ctypes.c_void_p, # pfnclose : PFNCLOSE
ctypes.c_void_p, # pfnseek : PFNSEEK
ctypes.c_int, # cpuType : FDICREATE_CPU_TYPE
ctypes.c_void_p, # perf : ERF* in/out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('Cabinet.dll')
FDICreate = Fiddle::Function.new(
lib['FDICreate'],
[
Fiddle::TYPE_VOIDP, # pfnalloc : PFNALLOC
Fiddle::TYPE_VOIDP, # pfnfree : PFNFREE
Fiddle::TYPE_VOIDP, # pfnopen : PFNOPEN
Fiddle::TYPE_VOIDP, # pfnread : PFNREAD
Fiddle::TYPE_VOIDP, # pfnwrite : PFNWRITE
Fiddle::TYPE_VOIDP, # pfnclose : PFNCLOSE
Fiddle::TYPE_VOIDP, # pfnseek : PFNSEEK
Fiddle::TYPE_INT, # cpuType : FDICREATE_CPU_TYPE
Fiddle::TYPE_VOIDP, # perf : ERF* in/out
],
Fiddle::TYPE_VOIDP, Fiddle::Function::CDECL)#[link(name = "cabinet")]
extern "C" {
fn FDICreate(
pfnalloc: *const core::ffi::c_void, // PFNALLOC
pfnfree: *const core::ffi::c_void, // PFNFREE
pfnopen: *const core::ffi::c_void, // PFNOPEN
pfnread: *const core::ffi::c_void, // PFNREAD
pfnwrite: *const core::ffi::c_void, // PFNWRITE
pfnclose: *const core::ffi::c_void, // PFNCLOSE
pfnseek: *const core::ffi::c_void, // PFNSEEK
cpuType: i32, // FDICREATE_CPU_TYPE
perf: *mut ERF // ERF* in/out
) -> *mut ();
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("Cabinet.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr FDICreate(IntPtr pfnalloc, IntPtr pfnfree, IntPtr pfnopen, IntPtr pfnread, IntPtr pfnwrite, IntPtr pfnclose, IntPtr pfnseek, int cpuType, IntPtr perf);
"@
$api = Add-Type -MemberDefinition $sig -Name 'Cabinet_FDICreate' -Namespace Win32 -PassThru
# $api::FDICreate(pfnalloc, pfnfree, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, cpuType, perf)#uselib "Cabinet.dll"
#func global FDICreate "FDICreate" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; FDICreate pfnalloc, pfnfree, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, cpuType, varptr(perf) ; 戻り値は stat
; pfnalloc : PFNALLOC -> "sptr"
; pfnfree : PFNFREE -> "sptr"
; pfnopen : PFNOPEN -> "sptr"
; pfnread : PFNREAD -> "sptr"
; pfnwrite : PFNWRITE -> "sptr"
; pfnclose : PFNCLOSE -> "sptr"
; pfnseek : PFNSEEK -> "sptr"
; cpuType : FDICREATE_CPU_TYPE -> "sptr"
; perf : ERF* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。出力引数:
#uselib "Cabinet.dll" #cfunc global FDICreate "FDICreate" sptr, sptr, sptr, sptr, sptr, sptr, sptr, int, var ; res = FDICreate(pfnalloc, pfnfree, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, cpuType, perf) ; pfnalloc : PFNALLOC -> "sptr" ; pfnfree : PFNFREE -> "sptr" ; pfnopen : PFNOPEN -> "sptr" ; pfnread : PFNREAD -> "sptr" ; pfnwrite : PFNWRITE -> "sptr" ; pfnclose : PFNCLOSE -> "sptr" ; pfnseek : PFNSEEK -> "sptr" ; cpuType : FDICREATE_CPU_TYPE -> "int" ; perf : ERF* in/out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "Cabinet.dll" #cfunc global FDICreate "FDICreate" sptr, sptr, sptr, sptr, sptr, sptr, sptr, int, sptr ; res = FDICreate(pfnalloc, pfnfree, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, cpuType, varptr(perf)) ; pfnalloc : PFNALLOC -> "sptr" ; pfnfree : PFNFREE -> "sptr" ; pfnopen : PFNOPEN -> "sptr" ; pfnread : PFNREAD -> "sptr" ; pfnwrite : PFNWRITE -> "sptr" ; pfnclose : PFNCLOSE -> "sptr" ; pfnseek : PFNSEEK -> "sptr" ; cpuType : FDICREATE_CPU_TYPE -> "int" ; perf : ERF* in/out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
出力引数:
; void* FDICreate(PFNALLOC pfnalloc, PFNFREE pfnfree, PFNOPEN pfnopen, PFNREAD pfnread, PFNWRITE pfnwrite, PFNCLOSE pfnclose, PFNSEEK pfnseek, FDICREATE_CPU_TYPE cpuType, ERF* perf) #uselib "Cabinet.dll" #cfunc global FDICreate "FDICreate" intptr, intptr, intptr, intptr, intptr, intptr, intptr, int, var ; res = FDICreate(pfnalloc, pfnfree, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, cpuType, perf) ; pfnalloc : PFNALLOC -> "intptr" ; pfnfree : PFNFREE -> "intptr" ; pfnopen : PFNOPEN -> "intptr" ; pfnread : PFNREAD -> "intptr" ; pfnwrite : PFNWRITE -> "intptr" ; pfnclose : PFNCLOSE -> "intptr" ; pfnseek : PFNSEEK -> "intptr" ; cpuType : FDICREATE_CPU_TYPE -> "int" ; perf : ERF* in/out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; void* FDICreate(PFNALLOC pfnalloc, PFNFREE pfnfree, PFNOPEN pfnopen, PFNREAD pfnread, PFNWRITE pfnwrite, PFNCLOSE pfnclose, PFNSEEK pfnseek, FDICREATE_CPU_TYPE cpuType, ERF* perf) #uselib "Cabinet.dll" #cfunc global FDICreate "FDICreate" intptr, intptr, intptr, intptr, intptr, intptr, intptr, int, intptr ; res = FDICreate(pfnalloc, pfnfree, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, cpuType, varptr(perf)) ; pfnalloc : PFNALLOC -> "intptr" ; pfnfree : PFNFREE -> "intptr" ; pfnopen : PFNOPEN -> "intptr" ; pfnread : PFNREAD -> "intptr" ; pfnwrite : PFNWRITE -> "intptr" ; pfnclose : PFNCLOSE -> "intptr" ; pfnseek : PFNSEEK -> "intptr" ; cpuType : FDICREATE_CPU_TYPE -> "int" ; perf : ERF* in/out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
cabinet = windows.NewLazySystemDLL("Cabinet.dll")
procFDICreate = cabinet.NewProc("FDICreate")
)
// pfnalloc (PFNALLOC), pfnfree (PFNFREE), pfnopen (PFNOPEN), pfnread (PFNREAD), pfnwrite (PFNWRITE), pfnclose (PFNCLOSE), pfnseek (PFNSEEK), cpuType (FDICREATE_CPU_TYPE), perf (ERF* in/out)
r1, _, err := procFDICreate.Call(
uintptr(pfnalloc),
uintptr(pfnfree),
uintptr(pfnopen),
uintptr(pfnread),
uintptr(pfnwrite),
uintptr(pfnclose),
uintptr(pfnseek),
uintptr(cpuType),
uintptr(perf),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // void*function FDICreate(
pfnalloc: Pointer; // PFNALLOC
pfnfree: Pointer; // PFNFREE
pfnopen: Pointer; // PFNOPEN
pfnread: Pointer; // PFNREAD
pfnwrite: Pointer; // PFNWRITE
pfnclose: Pointer; // PFNCLOSE
pfnseek: Pointer; // PFNSEEK
cpuType: Integer; // FDICREATE_CPU_TYPE
perf: Pointer // ERF* in/out
): Pointer; cdecl;
external 'Cabinet.dll' name 'FDICreate';result := DllCall("Cabinet\FDICreate"
, "Ptr", pfnalloc ; PFNALLOC
, "Ptr", pfnfree ; PFNFREE
, "Ptr", pfnopen ; PFNOPEN
, "Ptr", pfnread ; PFNREAD
, "Ptr", pfnwrite ; PFNWRITE
, "Ptr", pfnclose ; PFNCLOSE
, "Ptr", pfnseek ; PFNSEEK
, "Int", cpuType ; FDICREATE_CPU_TYPE
, "Ptr", perf ; ERF* in/out
, "Cdecl Ptr") ; return: void*●FDICreate(pfnalloc, pfnfree, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, cpuType, perf) = DLL("Cabinet.dll", "void* FDICreate(void*, void*, void*, void*, void*, void*, void*, int, void*)")
# 呼び出し: FDICreate(pfnalloc, pfnfree, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, cpuType, perf)
# pfnalloc : PFNALLOC -> "void*"
# pfnfree : PFNFREE -> "void*"
# pfnopen : PFNOPEN -> "void*"
# pfnread : PFNREAD -> "void*"
# pfnwrite : PFNWRITE -> "void*"
# pfnclose : PFNCLOSE -> "void*"
# pfnseek : PFNSEEK -> "void*"
# cpuType : FDICREATE_CPU_TYPE -> "int"
# perf : ERF* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※cdecl関数。DLL()宣言はstdcall前提。cdeclは EXEC_PTR(`cdecl`,…) を使用。