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

FCICreate

関数
ファイル圧縮インターフェイス(FCI)のコンテキストを生成する。
DLLCabinet.dll呼出規約cdecl

シグネチャ

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

void* FCICreate(
    ERF* perf,
    PFNFCIFILEPLACED pfnfcifp,
    PFNFCIALLOC pfna,
    PFNFCIFREE pfnf,
    PFNFCIOPEN pfnopen,
    PFNFCIREAD pfnread,
    PFNFCIWRITE pfnwrite,
    PFNFCICLOSE pfnclose,
    PFNFCISEEK pfnseek,
    PFNFCIDELETE pfndelete,
    PFNFCIGETTEMPFILE pfnfcigtf,
    CCAB* pccab,
    void* pv   // optional
);

パラメーター

名前方向
perfERF*in
pfnfcifpPFNFCIFILEPLACEDin
pfnaPFNFCIALLOCin
pfnfPFNFCIFREEin
pfnopenPFNFCIOPENin
pfnreadPFNFCIREADin
pfnwritePFNFCIWRITEin
pfnclosePFNFCICLOSEin
pfnseekPFNFCISEEKin
pfndeletePFNFCIDELETEin
pfnfcigtfPFNFCIGETTEMPFILEin
pccabCCAB*in
pvvoid*inoptional

戻り値の型: void*

各言語での呼び出し定義

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

void* FCICreate(
    ERF* perf,
    PFNFCIFILEPLACED pfnfcifp,
    PFNFCIALLOC pfna,
    PFNFCIFREE pfnf,
    PFNFCIOPEN pfnopen,
    PFNFCIREAD pfnread,
    PFNFCIWRITE pfnwrite,
    PFNFCICLOSE pfnclose,
    PFNFCISEEK pfnseek,
    PFNFCIDELETE pfndelete,
    PFNFCIGETTEMPFILE pfnfcigtf,
    CCAB* pccab,
    void* pv   // optional
);
[DllImport("Cabinet.dll", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr FCICreate(
    IntPtr perf,   // ERF*
    IntPtr pfnfcifp,   // PFNFCIFILEPLACED
    IntPtr pfna,   // PFNFCIALLOC
    IntPtr pfnf,   // PFNFCIFREE
    IntPtr pfnopen,   // PFNFCIOPEN
    IntPtr pfnread,   // PFNFCIREAD
    IntPtr pfnwrite,   // PFNFCIWRITE
    IntPtr pfnclose,   // PFNFCICLOSE
    IntPtr pfnseek,   // PFNFCISEEK
    IntPtr pfndelete,   // PFNFCIDELETE
    IntPtr pfnfcigtf,   // PFNFCIGETTEMPFILE
    IntPtr pccab,   // CCAB*
    IntPtr pv   // void* optional
);
<DllImport("Cabinet.dll", ExactSpelling:=True, CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function FCICreate(
    perf As IntPtr,   ' ERF*
    pfnfcifp As IntPtr,   ' PFNFCIFILEPLACED
    pfna As IntPtr,   ' PFNFCIALLOC
    pfnf As IntPtr,   ' PFNFCIFREE
    pfnopen As IntPtr,   ' PFNFCIOPEN
    pfnread As IntPtr,   ' PFNFCIREAD
    pfnwrite As IntPtr,   ' PFNFCIWRITE
    pfnclose As IntPtr,   ' PFNFCICLOSE
    pfnseek As IntPtr,   ' PFNFCISEEK
    pfndelete As IntPtr,   ' PFNFCIDELETE
    pfnfcigtf As IntPtr,   ' PFNFCIGETTEMPFILE
    pccab As IntPtr,   ' CCAB*
    pv As IntPtr   ' void* optional
) As IntPtr
End Function
' perf : ERF*
' pfnfcifp : PFNFCIFILEPLACED
' pfna : PFNFCIALLOC
' pfnf : PFNFCIFREE
' pfnopen : PFNFCIOPEN
' pfnread : PFNFCIREAD
' pfnwrite : PFNFCIWRITE
' pfnclose : PFNFCICLOSE
' pfnseek : PFNFCISEEK
' pfndelete : PFNFCIDELETE
' pfnfcigtf : PFNFCIGETTEMPFILE
' pccab : CCAB*
' pv : void* optional
Declare PtrSafe Function FCICreate Lib "cabinet" ( _
    ByVal perf As LongPtr, _
    ByVal pfnfcifp As LongPtr, _
    ByVal pfna As LongPtr, _
    ByVal pfnf As LongPtr, _
    ByVal pfnopen As LongPtr, _
    ByVal pfnread As LongPtr, _
    ByVal pfnwrite As LongPtr, _
    ByVal pfnclose As LongPtr, _
    ByVal pfnseek As LongPtr, _
    ByVal pfndelete As LongPtr, _
    ByVal pfnfcigtf As LongPtr, _
    ByVal pccab As LongPtr, _
    ByVal pv As LongPtr) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

FCICreate = ctypes.cdll.cabinet.FCICreate
FCICreate.restype = ctypes.c_void_p
FCICreate.argtypes = [
    ctypes.c_void_p,  # perf : ERF*
    ctypes.c_void_p,  # pfnfcifp : PFNFCIFILEPLACED
    ctypes.c_void_p,  # pfna : PFNFCIALLOC
    ctypes.c_void_p,  # pfnf : PFNFCIFREE
    ctypes.c_void_p,  # pfnopen : PFNFCIOPEN
    ctypes.c_void_p,  # pfnread : PFNFCIREAD
    ctypes.c_void_p,  # pfnwrite : PFNFCIWRITE
    ctypes.c_void_p,  # pfnclose : PFNFCICLOSE
    ctypes.c_void_p,  # pfnseek : PFNFCISEEK
    ctypes.c_void_p,  # pfndelete : PFNFCIDELETE
    ctypes.c_void_p,  # pfnfcigtf : PFNFCIGETTEMPFILE
    ctypes.c_void_p,  # pccab : CCAB*
    ctypes.POINTER(None),  # pv : void* optional
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('Cabinet.dll')
FCICreate = Fiddle::Function.new(
  lib['FCICreate'],
  [
    Fiddle::TYPE_VOIDP,  # perf : ERF*
    Fiddle::TYPE_VOIDP,  # pfnfcifp : PFNFCIFILEPLACED
    Fiddle::TYPE_VOIDP,  # pfna : PFNFCIALLOC
    Fiddle::TYPE_VOIDP,  # pfnf : PFNFCIFREE
    Fiddle::TYPE_VOIDP,  # pfnopen : PFNFCIOPEN
    Fiddle::TYPE_VOIDP,  # pfnread : PFNFCIREAD
    Fiddle::TYPE_VOIDP,  # pfnwrite : PFNFCIWRITE
    Fiddle::TYPE_VOIDP,  # pfnclose : PFNFCICLOSE
    Fiddle::TYPE_VOIDP,  # pfnseek : PFNFCISEEK
    Fiddle::TYPE_VOIDP,  # pfndelete : PFNFCIDELETE
    Fiddle::TYPE_VOIDP,  # pfnfcigtf : PFNFCIGETTEMPFILE
    Fiddle::TYPE_VOIDP,  # pccab : CCAB*
    Fiddle::TYPE_VOIDP,  # pv : void* optional
  ],
  Fiddle::TYPE_VOIDP, Fiddle::Function::CDECL)
#[link(name = "cabinet")]
extern "C" {
    fn FCICreate(
        perf: *mut ERF,  // ERF*
        pfnfcifp: *const core::ffi::c_void,  // PFNFCIFILEPLACED
        pfna: *const core::ffi::c_void,  // PFNFCIALLOC
        pfnf: *const core::ffi::c_void,  // PFNFCIFREE
        pfnopen: *const core::ffi::c_void,  // PFNFCIOPEN
        pfnread: *const core::ffi::c_void,  // PFNFCIREAD
        pfnwrite: *const core::ffi::c_void,  // PFNFCIWRITE
        pfnclose: *const core::ffi::c_void,  // PFNFCICLOSE
        pfnseek: *const core::ffi::c_void,  // PFNFCISEEK
        pfndelete: *const core::ffi::c_void,  // PFNFCIDELETE
        pfnfcigtf: *const core::ffi::c_void,  // PFNFCIGETTEMPFILE
        pccab: *mut CCAB,  // CCAB*
        pv: *mut ()  // void* optional
    ) -> *mut ();
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("Cabinet.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr FCICreate(IntPtr perf, IntPtr pfnfcifp, IntPtr pfna, IntPtr pfnf, IntPtr pfnopen, IntPtr pfnread, IntPtr pfnwrite, IntPtr pfnclose, IntPtr pfnseek, IntPtr pfndelete, IntPtr pfnfcigtf, IntPtr pccab, IntPtr pv);
"@
$api = Add-Type -MemberDefinition $sig -Name 'Cabinet_FCICreate' -Namespace Win32 -PassThru
# $api::FCICreate(perf, pfnfcifp, pfna, pfnf, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, pfndelete, pfnfcigtf, pccab, pv)
#uselib "Cabinet.dll"
#func global FCICreate "FCICreate" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; FCICreate varptr(perf), pfnfcifp, pfna, pfnf, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, pfndelete, pfnfcigtf, varptr(pccab), pv   ; 戻り値は stat
; perf : ERF* -> "sptr"
; pfnfcifp : PFNFCIFILEPLACED -> "sptr"
; pfna : PFNFCIALLOC -> "sptr"
; pfnf : PFNFCIFREE -> "sptr"
; pfnopen : PFNFCIOPEN -> "sptr"
; pfnread : PFNFCIREAD -> "sptr"
; pfnwrite : PFNFCIWRITE -> "sptr"
; pfnclose : PFNFCICLOSE -> "sptr"
; pfnseek : PFNFCISEEK -> "sptr"
; pfndelete : PFNFCIDELETE -> "sptr"
; pfnfcigtf : PFNFCIGETTEMPFILE -> "sptr"
; pccab : CCAB* -> "sptr"
; pv : void* optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "Cabinet.dll"
#cfunc global FCICreate "FCICreate" var, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, var, sptr
; res = FCICreate(perf, pfnfcifp, pfna, pfnf, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, pfndelete, pfnfcigtf, pccab, pv)
; perf : ERF* -> "var"
; pfnfcifp : PFNFCIFILEPLACED -> "sptr"
; pfna : PFNFCIALLOC -> "sptr"
; pfnf : PFNFCIFREE -> "sptr"
; pfnopen : PFNFCIOPEN -> "sptr"
; pfnread : PFNFCIREAD -> "sptr"
; pfnwrite : PFNFCIWRITE -> "sptr"
; pfnclose : PFNFCICLOSE -> "sptr"
; pfnseek : PFNFCISEEK -> "sptr"
; pfndelete : PFNFCIDELETE -> "sptr"
; pfnfcigtf : PFNFCIGETTEMPFILE -> "sptr"
; pccab : CCAB* -> "var"
; pv : void* optional -> "sptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; void* FCICreate(ERF* perf, PFNFCIFILEPLACED pfnfcifp, PFNFCIALLOC pfna, PFNFCIFREE pfnf, PFNFCIOPEN pfnopen, PFNFCIREAD pfnread, PFNFCIWRITE pfnwrite, PFNFCICLOSE pfnclose, PFNFCISEEK pfnseek, PFNFCIDELETE pfndelete, PFNFCIGETTEMPFILE pfnfcigtf, CCAB* pccab, void* pv)
#uselib "Cabinet.dll"
#cfunc global FCICreate "FCICreate" var, intptr, intptr, intptr, intptr, intptr, intptr, intptr, intptr, intptr, intptr, var, intptr
; res = FCICreate(perf, pfnfcifp, pfna, pfnf, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, pfndelete, pfnfcigtf, pccab, pv)
; perf : ERF* -> "var"
; pfnfcifp : PFNFCIFILEPLACED -> "intptr"
; pfna : PFNFCIALLOC -> "intptr"
; pfnf : PFNFCIFREE -> "intptr"
; pfnopen : PFNFCIOPEN -> "intptr"
; pfnread : PFNFCIREAD -> "intptr"
; pfnwrite : PFNFCIWRITE -> "intptr"
; pfnclose : PFNFCICLOSE -> "intptr"
; pfnseek : PFNFCISEEK -> "intptr"
; pfndelete : PFNFCIDELETE -> "intptr"
; pfnfcigtf : PFNFCIGETTEMPFILE -> "intptr"
; pccab : CCAB* -> "var"
; pv : void* optional -> "intptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	cabinet = windows.NewLazySystemDLL("Cabinet.dll")
	procFCICreate = cabinet.NewProc("FCICreate")
)

// perf (ERF*), pfnfcifp (PFNFCIFILEPLACED), pfna (PFNFCIALLOC), pfnf (PFNFCIFREE), pfnopen (PFNFCIOPEN), pfnread (PFNFCIREAD), pfnwrite (PFNFCIWRITE), pfnclose (PFNFCICLOSE), pfnseek (PFNFCISEEK), pfndelete (PFNFCIDELETE), pfnfcigtf (PFNFCIGETTEMPFILE), pccab (CCAB*), pv (void* optional)
r1, _, err := procFCICreate.Call(
	uintptr(perf),
	uintptr(pfnfcifp),
	uintptr(pfna),
	uintptr(pfnf),
	uintptr(pfnopen),
	uintptr(pfnread),
	uintptr(pfnwrite),
	uintptr(pfnclose),
	uintptr(pfnseek),
	uintptr(pfndelete),
	uintptr(pfnfcigtf),
	uintptr(pccab),
	uintptr(pv),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // void*
function FCICreate(
  perf: Pointer;   // ERF*
  pfnfcifp: Pointer;   // PFNFCIFILEPLACED
  pfna: Pointer;   // PFNFCIALLOC
  pfnf: Pointer;   // PFNFCIFREE
  pfnopen: Pointer;   // PFNFCIOPEN
  pfnread: Pointer;   // PFNFCIREAD
  pfnwrite: Pointer;   // PFNFCIWRITE
  pfnclose: Pointer;   // PFNFCICLOSE
  pfnseek: Pointer;   // PFNFCISEEK
  pfndelete: Pointer;   // PFNFCIDELETE
  pfnfcigtf: Pointer;   // PFNFCIGETTEMPFILE
  pccab: Pointer;   // CCAB*
  pv: Pointer   // void* optional
): Pointer; cdecl;
  external 'Cabinet.dll' name 'FCICreate';
result := DllCall("Cabinet\FCICreate"
    , "Ptr", perf   ; ERF*
    , "Ptr", pfnfcifp   ; PFNFCIFILEPLACED
    , "Ptr", pfna   ; PFNFCIALLOC
    , "Ptr", pfnf   ; PFNFCIFREE
    , "Ptr", pfnopen   ; PFNFCIOPEN
    , "Ptr", pfnread   ; PFNFCIREAD
    , "Ptr", pfnwrite   ; PFNFCIWRITE
    , "Ptr", pfnclose   ; PFNFCICLOSE
    , "Ptr", pfnseek   ; PFNFCISEEK
    , "Ptr", pfndelete   ; PFNFCIDELETE
    , "Ptr", pfnfcigtf   ; PFNFCIGETTEMPFILE
    , "Ptr", pccab   ; CCAB*
    , "Ptr", pv   ; void* optional
    , "Cdecl Ptr")   ; return: void*
●FCICreate(perf, pfnfcifp, pfna, pfnf, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, pfndelete, pfnfcigtf, pccab, pv) = DLL("Cabinet.dll", "void* FCICreate(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*)")
# 呼び出し: FCICreate(perf, pfnfcifp, pfna, pfnf, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, pfndelete, pfnfcigtf, pccab, pv)
# perf : ERF* -> "void*"
# pfnfcifp : PFNFCIFILEPLACED -> "void*"
# pfna : PFNFCIALLOC -> "void*"
# pfnf : PFNFCIFREE -> "void*"
# pfnopen : PFNFCIOPEN -> "void*"
# pfnread : PFNFCIREAD -> "void*"
# pfnwrite : PFNFCIWRITE -> "void*"
# pfnclose : PFNFCICLOSE -> "void*"
# pfnseek : PFNFCISEEK -> "void*"
# pfndelete : PFNFCIDELETE -> "void*"
# pfnfcigtf : PFNFCIGETTEMPFILE -> "void*"
# pccab : CCAB* -> "void*"
# pv : void* optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※cdecl関数。DLL()宣言はstdcall前提。cdeclは EXEC_PTR(`cdecl`,…) を使用。