Win32 API 日本語リファレンス
ホームStorage.Cabinets › FDICreate

FDICreate

関数
ファイル展開インターフェイス(FDI)のコンテキストを生成する。
DLLCabinet.dll呼出規約cdecl対応OSWindows 2000 以降

シグネチャ

// 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
);

パラメーター

名前方向
pfnallocPFNALLOCin
pfnfreePFNFREEin
pfnopenPFNOPENin
pfnreadPFNREADin
pfnwritePFNWRITEin
pfnclosePFNCLOSEin
pfnseekPFNSEEKin
cpuTypeFDICREATE_CPU_TYPEin
perfERF*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 方式にも切替可。
出力引数:
; 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 方式にも切替可。
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`,…) を使用。