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メモリ割り当て用コールバック関数ポインタ。FDI内部のメモリ確保に使われる。
pfnfreePFNFREEinメモリ解放用コールバック関数ポインタ。
pfnopenPFNOPENinファイルを開くためのコールバック関数ポインタ。
pfnreadPFNREADinファイル読み取り用コールバック関数ポインタ。
pfnwritePFNWRITEinファイル書き込み用コールバック関数ポインタ。
pfnclosePFNCLOSEinファイルを閉じるためのコールバック関数ポインタ。
pfnseekPFNSEEKinファイルシーク用コールバック関数ポインタ。
cpuTypeFDICREATE_CPU_TYPEin対象CPU種別を示すFDICREATE_CPU_TYPE列挙値。現在は無視され互換のために存在する。
perfERF*inoutエラー情報を受け取るERF構造体へのポインタ。FDI操作中の発生エラーを記録する。

戻り値の型: 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`,…) を使用。
const std = @import("std");

extern "cabinet" fn FDICreate(
    pfnalloc: ?*anyopaque, // PFNALLOC
    pfnfree: ?*anyopaque, // PFNFREE
    pfnopen: ?*anyopaque, // PFNOPEN
    pfnread: ?*anyopaque, // PFNREAD
    pfnwrite: ?*anyopaque, // PFNWRITE
    pfnclose: ?*anyopaque, // PFNCLOSE
    pfnseek: ?*anyopaque, // PFNSEEK
    cpuType: i32, // FDICREATE_CPU_TYPE
    perf: [*c]ERF // ERF* in/out
) callconv(.c) ?*anyopaque;
proc FDICreate(
    pfnalloc: pointer,  # PFNALLOC
    pfnfree: pointer,  # PFNFREE
    pfnopen: pointer,  # PFNOPEN
    pfnread: pointer,  # PFNREAD
    pfnwrite: pointer,  # PFNWRITE
    pfnclose: pointer,  # PFNCLOSE
    pfnseek: pointer,  # PFNSEEK
    cpuType: int32,  # FDICREATE_CPU_TYPE
    perf: ptr ERF  # ERF* in/out
): pointer {.importc: "FDICreate", cdecl, dynlib: "Cabinet.dll".}
pragma(lib, "cabinet");
extern(C)
void* FDICreate(
    void* pfnalloc,   // PFNALLOC
    void* pfnfree,   // PFNFREE
    void* pfnopen,   // PFNOPEN
    void* pfnread,   // PFNREAD
    void* pfnwrite,   // PFNWRITE
    void* pfnclose,   // PFNCLOSE
    void* pfnseek,   // PFNSEEK
    int cpuType,   // FDICREATE_CPU_TYPE
    ERF* perf   // ERF* in/out
);
ccall((:FDICreate, "Cabinet.dll"), Ptr{Cvoid},
      (Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Int32, Ptr{ERF}),
      pfnalloc, pfnfree, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, cpuType, perf)
# pfnalloc : PFNALLOC -> Ptr{Cvoid}
# pfnfree : PFNFREE -> Ptr{Cvoid}
# pfnopen : PFNOPEN -> Ptr{Cvoid}
# pfnread : PFNREAD -> Ptr{Cvoid}
# pfnwrite : PFNWRITE -> Ptr{Cvoid}
# pfnclose : PFNCLOSE -> Ptr{Cvoid}
# pfnseek : PFNSEEK -> Ptr{Cvoid}
# cpuType : FDICREATE_CPU_TYPE -> Int32
# perf : ERF* in/out -> Ptr{ERF}
local ffi = require("ffi")
ffi.cdef[[
void* FDICreate(
    void* pfnalloc,
    void* pfnfree,
    void* pfnopen,
    void* pfnread,
    void* pfnwrite,
    void* pfnclose,
    void* pfnseek,
    int32_t cpuType,
    void* perf);
]]
local cabinet = ffi.load("cabinet")
-- cabinet.FDICreate(pfnalloc, pfnfree, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, cpuType, perf)
-- pfnalloc : PFNALLOC
-- pfnfree : PFNFREE
-- pfnopen : PFNOPEN
-- pfnread : PFNREAD
-- pfnwrite : PFNWRITE
-- pfnclose : PFNCLOSE
-- pfnseek : PFNSEEK
-- cpuType : FDICREATE_CPU_TYPE
-- perf : ERF* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('Cabinet.dll');
const FDICreate = lib.func('__cdecl', 'FDICreate', 'void *', ['void *', 'void *', 'void *', 'void *', 'void *', 'void *', 'void *', 'int32_t', '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 -> 'int32_t'
// perf : ERF* in/out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
// コールバック(関数ポインタ)は koffi.proto/koffi.register で型を定義して渡す(素の void* では JS 関数を渡せない)。
const lib = Deno.dlopen("Cabinet.dll", {
  FDICreate: { parameters: ["pointer", "pointer", "pointer", "pointer", "pointer", "pointer", "pointer", "i32", "pointer"], result: "pointer" },
});
// lib.symbols.FDICreate(pfnalloc, pfnfree, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, cpuType, perf)
// pfnalloc : PFNALLOC -> "pointer"
// pfnfree : PFNFREE -> "pointer"
// pfnopen : PFNOPEN -> "pointer"
// pfnread : PFNREAD -> "pointer"
// pfnwrite : PFNWRITE -> "pointer"
// pfnclose : PFNCLOSE -> "pointer"
// pfnseek : PFNSEEK -> "pointer"
// cpuType : FDICREATE_CPU_TYPE -> "i32"
// perf : ERF* in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
void* FDICreate(
    void* pfnalloc,
    void* pfnfree,
    void* pfnopen,
    void* pfnread,
    void* pfnwrite,
    void* pfnclose,
    void* pfnseek,
    int32_t cpuType,
    void* perf);
C, "Cabinet.dll");
// $ffi->FDICreate(pfnalloc, pfnfree, pfnopen, pfnread, pfnwrite, pfnclose, pfnseek, cpuType, perf);
// pfnalloc : PFNALLOC
// pfnfree : PFNFREE
// pfnopen : PFNOPEN
// pfnread : PFNREAD
// pfnwrite : PFNWRITE
// pfnclose : PFNCLOSE
// pfnseek : PFNSEEK
// cpuType : FDICREATE_CPU_TYPE
// perf : ERF* in/out
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Cabinet extends Library {
    Cabinet INSTANCE = Native.load("cabinet", Cabinet.class);
    Pointer FDICreate(
        Callback pfnalloc,   // PFNALLOC
        Callback pfnfree,   // PFNFREE
        Callback pfnopen,   // PFNOPEN
        Callback pfnread,   // PFNREAD
        Callback pfnwrite,   // PFNWRITE
        Callback pfnclose,   // PFNCLOSE
        Callback pfnseek,   // PFNSEEK
        int cpuType,   // FDICREATE_CPU_TYPE
        Pointer perf   // ERF* in/out
    );
}
@[Link("cabinet")]
lib LibCabinet
  fun FDICreate = FDICreate(
    pfnalloc : Void*,   # PFNALLOC
    pfnfree : Void*,   # PFNFREE
    pfnopen : Void*,   # PFNOPEN
    pfnread : Void*,   # PFNREAD
    pfnwrite : Void*,   # PFNWRITE
    pfnclose : Void*,   # PFNCLOSE
    pfnseek : Void*,   # PFNSEEK
    cpuType : Int32,   # FDICREATE_CPU_TYPE
    perf : ERF*   # ERF* in/out
  ) : Void*
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef FDICreateNative = Pointer<Void> Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Int32, Pointer<Void>);
typedef FDICreateDart = Pointer<Void> Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, int, Pointer<Void>);
final FDICreate = DynamicLibrary.open('Cabinet.dll')
    .lookupFunction<FDICreateNative, FDICreateDart>('FDICreate');
// pfnalloc : PFNALLOC -> Pointer<Void>
// pfnfree : PFNFREE -> Pointer<Void>
// pfnopen : PFNOPEN -> Pointer<Void>
// pfnread : PFNREAD -> Pointer<Void>
// pfnwrite : PFNWRITE -> Pointer<Void>
// pfnclose : PFNCLOSE -> Pointer<Void>
// pfnseek : PFNSEEK -> Pointer<Void>
// cpuType : FDICREATE_CPU_TYPE -> Int32
// perf : ERF* in/out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
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';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import ccall safe "FDICreate"
  c_FDICreate :: Ptr () -> Ptr () -> Ptr () -> Ptr () -> Ptr () -> Ptr () -> Ptr () -> Int32 -> Ptr () -> IO (Ptr ())
-- pfnalloc : PFNALLOC -> Ptr ()
-- pfnfree : PFNFREE -> Ptr ()
-- pfnopen : PFNOPEN -> Ptr ()
-- pfnread : PFNREAD -> Ptr ()
-- pfnwrite : PFNWRITE -> Ptr ()
-- pfnclose : PFNCLOSE -> Ptr ()
-- pfnseek : PFNSEEK -> Ptr ()
-- cpuType : FDICREATE_CPU_TYPE -> Int32
-- perf : ERF* in/out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let fdicreate =
  foreign "FDICreate"
    ((ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> int32_t @-> (ptr void) @-> returning (ptr void))
(* pfnalloc : PFNALLOC -> (ptr void) *)
(* pfnfree : PFNFREE -> (ptr void) *)
(* pfnopen : PFNOPEN -> (ptr void) *)
(* pfnread : PFNREAD -> (ptr void) *)
(* pfnwrite : PFNWRITE -> (ptr void) *)
(* pfnclose : PFNCLOSE -> (ptr void) *)
(* pfnseek : PFNSEEK -> (ptr void) *)
(* cpuType : FDICREATE_CPU_TYPE -> int32_t *)
(* perf : ERF* in/out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library cabinet (t "Cabinet.dll"))
(cffi:use-foreign-library cabinet)

(cffi:defcfun ("FDICreate" fdicreate :convention :cdecl) :pointer
  (pfnalloc :pointer)   ; PFNALLOC
  (pfnfree :pointer)   ; PFNFREE
  (pfnopen :pointer)   ; PFNOPEN
  (pfnread :pointer)   ; PFNREAD
  (pfnwrite :pointer)   ; PFNWRITE
  (pfnclose :pointer)   ; PFNCLOSE
  (pfnseek :pointer)   ; PFNSEEK
  (cpu-type :int32)   ; FDICREATE_CPU_TYPE
  (perf :pointer))   ; ERF* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $FDICreate = Win32::API::More->new('Cabinet',
    'LPVOID FDICreate(LPVOID pfnalloc, LPVOID pfnfree, LPVOID pfnopen, LPVOID pfnread, LPVOID pfnwrite, LPVOID pfnclose, LPVOID pfnseek, int cpuType, LPVOID perf)');
# my $ret = $FDICreate->Call($pfnalloc, $pfnfree, $pfnopen, $pfnread, $pfnwrite, $pfnclose, $pfnseek, $cpuType, $perf);
# pfnalloc : PFNALLOC -> LPVOID
# pfnfree : PFNFREE -> LPVOID
# pfnopen : PFNOPEN -> LPVOID
# pfnread : PFNREAD -> LPVOID
# pfnwrite : PFNWRITE -> LPVOID
# pfnclose : PFNCLOSE -> LPVOID
# pfnseek : PFNSEEK -> LPVOID
# cpuType : FDICREATE_CPU_TYPE -> int
# perf : ERF* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# コールバック(関数ポインタ)は Perl sub を直接渡せません。Win32::API::Callback を使用してください。

関連項目

使用する型