ホーム › 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 | メモリ割り当て用コールバック関数ポインタ。FDI内部のメモリ確保に使われる。 |
| pfnfree | PFNFREE | in | メモリ解放用コールバック関数ポインタ。 |
| pfnopen | PFNOPEN | in | ファイルを開くためのコールバック関数ポインタ。 |
| pfnread | PFNREAD | in | ファイル読み取り用コールバック関数ポインタ。 |
| pfnwrite | PFNWRITE | in | ファイル書き込み用コールバック関数ポインタ。 |
| pfnclose | PFNCLOSE | in | ファイルを閉じるためのコールバック関数ポインタ。 |
| pfnseek | PFNSEEK | in | ファイルシーク用コールバック関数ポインタ。 |
| cpuType | FDICREATE_CPU_TYPE | in | 対象CPU種別を示すFDICREATE_CPU_TYPE列挙値。現在は無視され互換のために存在する。 |
| perf | ERF* | 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 方式にも切替可。#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`,…) を使用。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 を使用してください。