ホーム › Storage.Cabinets › FCICreate
FCICreate
関数ファイル圧縮インターフェイス(FCI)のコンテキストを生成する。
シグネチャ
// 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
);パラメーター
| 名前 | 型 | 方向 |
|---|---|---|
| perf | ERF* | in |
| pfnfcifp | PFNFCIFILEPLACED | in |
| pfna | PFNFCIALLOC | in |
| pfnf | PFNFCIFREE | in |
| pfnopen | PFNFCIOPEN | in |
| pfnread | PFNFCIREAD | in |
| pfnwrite | PFNFCIWRITE | in |
| pfnclose | PFNFCICLOSE | in |
| pfnseek | PFNFCISEEK | in |
| pfndelete | PFNFCIDELETE | in |
| pfnfcigtf | PFNFCIGETTEMPFILE | in |
| pccab | CCAB* | in |
| pv | void* | 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 方式にも切替可。#uselib "Cabinet.dll" #cfunc global FCICreate "FCICreate" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr ; res = FCICreate(varptr(perf), pfnfcifp, pfna, pfnf, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, pfndelete, pfnfcigtf, varptr(pccab), pv) ; 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" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは 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 方式にも切替可。; 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" intptr, intptr, intptr, intptr, intptr, intptr, intptr, intptr, intptr, intptr, intptr, intptr, intptr ; res = FCICreate(varptr(perf), pfnfcifp, pfna, pfnf, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, pfndelete, pfnfcigtf, varptr(pccab), pv) ; 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 -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは 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`,…) を使用。