Win32 API 日本語リファレンス
ホームGraphics.Gdi › MergeFontPackage

MergeFontPackage

関数
サブセットフォントパッケージを統合して完全なフォントを再構成する。
DLLFONTSUB.dll呼出規約cdecl対応OSWindows XP 以降

シグネチャ

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

DWORD MergeFontPackage(
    const BYTE* puchMergeFontBuffer,
    DWORD ulMergeFontBufferSize,
    const BYTE* puchFontPackageBuffer,
    DWORD ulFontPackageBufferSize,
    BYTE** ppuchDestBuffer,
    DWORD* pulDestBufferSize,
    DWORD* pulBytesWritten,
    WORD usMode,
    CFP_ALLOCPROC lpfnAllocate,
    CFP_REALLOCPROC lpfnReAllocate,
    CFP_FREEPROC lpfnFree,
    void* lpvReserved
);

パラメーター

名前方向説明
puchMergeFontBufferBYTE*inマージ対象のフォントを格納したバッファへのポインターです。これは usModeTTFMFP_DELTA の場合にのみ使用されます。
ulMergeFontBufferSizeDWORDin*puchMergeFontBuffer のサイズをバイト単位で指定します。
puchFontPackageBufferBYTE*inフォントパッケージを格納したバッファへのポインターです。
ulFontPackageBufferSizeDWORDin*puchMergeFontBuffer のサイズをバイト単位で指定します。
ppuchDestBufferBYTE**inoutunsigned char* 型の変数へのポインターです。MergeFontPackage 関数は、lpfnAllocate および lpfnReAllocate を使用してバッファ **ppuchDestBuffer を割り当てます。正常に復帰すると、そのバッファにはマージまたは展開された結果のフォントが格納されます。最終的にそのバッファを解放するのはアプリケーションの責任です。
pulDestBufferSizeDWORD*inoutunsigned long を指します。正常に復帰すると、割り当てられたバッファ **ppuchDestBuffer のサイズが格納されます。
pulBytesWrittenDWORD*inoutunsigned long を指します。正常に復帰すると、バッファ **ppuchDestBuffer で実際に使用されたバイト数が格納されます。
usModeWORDin

実行する処理の種類を指定します。次のいずれかの値を選択してください。これらは組み合わせることはできません。

意味
TTFMFP_SUBSET
単純なワーキングフォントをコピーします。下記の解説を参照してください。

puchMergeFontBuffer は無視されます。puchFontPackageBuffer には、usSubsetFormatTTFCFP_SUBSET に設定して CreateFontPackage で作成したワーキングフォントを格納する必要があります。このワーキングフォントは単に ppuchDestBuffer へコピーされます。

TTFMFP_SUBSET1
フォントパッケージをマージ可能なワーキングフォントに変換します。下記の解説を参照してください。

puchMergeFontBuffer は無視されます。puchFontPackageBuffer には、usSubsetFormatTTFCFP_SUBSET1 に設定して CreateFontPackage で作成したマージ可能なワーキングフォントを格納する必要があります。**ppuchDestBuffer に格納される結果は、後でマージできるワーキングフォントになります。

TTFMFP_DELTA
Delta フォントパッケージをマージ可能なワーキングフォントにマージします。下記の解説を参照してください。

*puchFontPackageBuffer には、usSubsetFormatTTFCFP_DELTA に設定して CreateFontPackage で作成したフォントパッケージを格納し、puchMergeFontBuffer には、usModeTTFMFP_SUBSET1 または TTFMFP_DELTA に設定した MergeFontPackage の事前の呼び出しによって作成したフォントパッケージを格納する必要があります。**ppuchDestBuffer に格納されるマージ後のフォントは、後でマージできるワーキングフォントになります。

lpfnAllocateCFP_ALLOCPROCinppuchDestBuffer および一時バッファのための初期メモリを割り当てるコールバック関数です。
lpfnReAllocateCFP_REALLOCPROCinppuchDestBuffer および一時バッファのためのメモリを再割り当てするコールバック関数です。
lpfnFreeCFP_FREEPROCinlpfnAllocate および lpfnReAllocate によって割り当てられたメモリを解放するコールバック関数です。
lpvReservedvoid*inoutNULL を設定する必要があります。

戻り値の型: DWORD

公式ドキュメント

MergeFontPackage 関数は、CreateFontPackage によって作成されたフォントを操作します。

戻り値

関数が成功した場合は、ゼロを返します。

それ以外の場合は、ゼロ以外の値を返します。返される可能性のあるエラーについては、フォントパッケージ関数のエラーメッセージ を参照してください。

解説(Remarks)

この関数は、それぞれがサブセットフォントを表す、4 つの異なる関連したエンティティを扱います。

エンティティ 生成元 フォントとして直接使用可能か
単純なワーキングフォント usSubsetFormat を TFCFP_SUBSET に設定した CreateFontPackage はい
フォントパッケージ usSubsetFormatTTFCFP_SUBSET1 に設定した CreateFontPackage いいえ
Delta フォントパッケージ usSubsetFormatTTFCFP_DELTA に設定した CreateFontPackage いいえ
マージ可能なワーキングフォント usModeTTFMFP_SUBSET1 または TTFMFP_DELTA に設定した MergeFontPackage はい
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

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

DWORD MergeFontPackage(
    const BYTE* puchMergeFontBuffer,
    DWORD ulMergeFontBufferSize,
    const BYTE* puchFontPackageBuffer,
    DWORD ulFontPackageBufferSize,
    BYTE** ppuchDestBuffer,
    DWORD* pulDestBufferSize,
    DWORD* pulBytesWritten,
    WORD usMode,
    CFP_ALLOCPROC lpfnAllocate,
    CFP_REALLOCPROC lpfnReAllocate,
    CFP_FREEPROC lpfnFree,
    void* lpvReserved
);
[DllImport("FONTSUB.dll", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
static extern uint MergeFontPackage(
    IntPtr puchMergeFontBuffer,   // BYTE*
    uint ulMergeFontBufferSize,   // DWORD
    IntPtr puchFontPackageBuffer,   // BYTE*
    uint ulFontPackageBufferSize,   // DWORD
    IntPtr ppuchDestBuffer,   // BYTE** in/out
    ref uint pulDestBufferSize,   // DWORD* in/out
    ref uint pulBytesWritten,   // DWORD* in/out
    ushort usMode,   // WORD
    IntPtr lpfnAllocate,   // CFP_ALLOCPROC
    IntPtr lpfnReAllocate,   // CFP_REALLOCPROC
    IntPtr lpfnFree,   // CFP_FREEPROC
    IntPtr lpvReserved   // void* in/out
);
<DllImport("FONTSUB.dll", ExactSpelling:=True, CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function MergeFontPackage(
    puchMergeFontBuffer As IntPtr,   ' BYTE*
    ulMergeFontBufferSize As UInteger,   ' DWORD
    puchFontPackageBuffer As IntPtr,   ' BYTE*
    ulFontPackageBufferSize As UInteger,   ' DWORD
    ppuchDestBuffer As IntPtr,   ' BYTE** in/out
    ByRef pulDestBufferSize As UInteger,   ' DWORD* in/out
    ByRef pulBytesWritten As UInteger,   ' DWORD* in/out
    usMode As UShort,   ' WORD
    lpfnAllocate As IntPtr,   ' CFP_ALLOCPROC
    lpfnReAllocate As IntPtr,   ' CFP_REALLOCPROC
    lpfnFree As IntPtr,   ' CFP_FREEPROC
    lpvReserved As IntPtr   ' void* in/out
) As UInteger
End Function
' puchMergeFontBuffer : BYTE*
' ulMergeFontBufferSize : DWORD
' puchFontPackageBuffer : BYTE*
' ulFontPackageBufferSize : DWORD
' ppuchDestBuffer : BYTE** in/out
' pulDestBufferSize : DWORD* in/out
' pulBytesWritten : DWORD* in/out
' usMode : WORD
' lpfnAllocate : CFP_ALLOCPROC
' lpfnReAllocate : CFP_REALLOCPROC
' lpfnFree : CFP_FREEPROC
' lpvReserved : void* in/out
Declare PtrSafe Function MergeFontPackage Lib "fontsub" ( _
    ByVal puchMergeFontBuffer As LongPtr, _
    ByVal ulMergeFontBufferSize As Long, _
    ByVal puchFontPackageBuffer As LongPtr, _
    ByVal ulFontPackageBufferSize As Long, _
    ByVal ppuchDestBuffer As LongPtr, _
    ByRef pulDestBufferSize As Long, _
    ByRef pulBytesWritten As Long, _
    ByVal usMode As Integer, _
    ByVal lpfnAllocate As LongPtr, _
    ByVal lpfnReAllocate As LongPtr, _
    ByVal lpfnFree As LongPtr, _
    ByVal lpvReserved As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

MergeFontPackage = ctypes.cdll.fontsub.MergeFontPackage
MergeFontPackage.restype = wintypes.DWORD
MergeFontPackage.argtypes = [
    ctypes.POINTER(ctypes.c_ubyte),  # puchMergeFontBuffer : BYTE*
    wintypes.DWORD,  # ulMergeFontBufferSize : DWORD
    ctypes.POINTER(ctypes.c_ubyte),  # puchFontPackageBuffer : BYTE*
    wintypes.DWORD,  # ulFontPackageBufferSize : DWORD
    ctypes.c_void_p,  # ppuchDestBuffer : BYTE** in/out
    ctypes.POINTER(wintypes.DWORD),  # pulDestBufferSize : DWORD* in/out
    ctypes.POINTER(wintypes.DWORD),  # pulBytesWritten : DWORD* in/out
    ctypes.c_ushort,  # usMode : WORD
    ctypes.c_void_p,  # lpfnAllocate : CFP_ALLOCPROC
    ctypes.c_void_p,  # lpfnReAllocate : CFP_REALLOCPROC
    ctypes.c_void_p,  # lpfnFree : CFP_FREEPROC
    ctypes.POINTER(None),  # lpvReserved : void* in/out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('FONTSUB.dll')
MergeFontPackage = Fiddle::Function.new(
  lib['MergeFontPackage'],
  [
    Fiddle::TYPE_VOIDP,  # puchMergeFontBuffer : BYTE*
    -Fiddle::TYPE_INT,  # ulMergeFontBufferSize : DWORD
    Fiddle::TYPE_VOIDP,  # puchFontPackageBuffer : BYTE*
    -Fiddle::TYPE_INT,  # ulFontPackageBufferSize : DWORD
    Fiddle::TYPE_VOIDP,  # ppuchDestBuffer : BYTE** in/out
    Fiddle::TYPE_VOIDP,  # pulDestBufferSize : DWORD* in/out
    Fiddle::TYPE_VOIDP,  # pulBytesWritten : DWORD* in/out
    -Fiddle::TYPE_SHORT,  # usMode : WORD
    Fiddle::TYPE_VOIDP,  # lpfnAllocate : CFP_ALLOCPROC
    Fiddle::TYPE_VOIDP,  # lpfnReAllocate : CFP_REALLOCPROC
    Fiddle::TYPE_VOIDP,  # lpfnFree : CFP_FREEPROC
    Fiddle::TYPE_VOIDP,  # lpvReserved : void* in/out
  ],
  -Fiddle::TYPE_INT, Fiddle::Function::CDECL)
#[link(name = "fontsub")]
extern "C" {
    fn MergeFontPackage(
        puchMergeFontBuffer: *const u8,  // BYTE*
        ulMergeFontBufferSize: u32,  // DWORD
        puchFontPackageBuffer: *const u8,  // BYTE*
        ulFontPackageBufferSize: u32,  // DWORD
        ppuchDestBuffer: *mut *mut u8,  // BYTE** in/out
        pulDestBufferSize: *mut u32,  // DWORD* in/out
        pulBytesWritten: *mut u32,  // DWORD* in/out
        usMode: u16,  // WORD
        lpfnAllocate: *const core::ffi::c_void,  // CFP_ALLOCPROC
        lpfnReAllocate: *const core::ffi::c_void,  // CFP_REALLOCPROC
        lpfnFree: *const core::ffi::c_void,  // CFP_FREEPROC
        lpvReserved: *mut ()  // void* in/out
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("FONTSUB.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint MergeFontPackage(IntPtr puchMergeFontBuffer, uint ulMergeFontBufferSize, IntPtr puchFontPackageBuffer, uint ulFontPackageBufferSize, IntPtr ppuchDestBuffer, ref uint pulDestBufferSize, ref uint pulBytesWritten, ushort usMode, IntPtr lpfnAllocate, IntPtr lpfnReAllocate, IntPtr lpfnFree, IntPtr lpvReserved);
"@
$api = Add-Type -MemberDefinition $sig -Name 'FONTSUB_MergeFontPackage' -Namespace Win32 -PassThru
# $api::MergeFontPackage(puchMergeFontBuffer, ulMergeFontBufferSize, puchFontPackageBuffer, ulFontPackageBufferSize, ppuchDestBuffer, pulDestBufferSize, pulBytesWritten, usMode, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
#uselib "FONTSUB.dll"
#func global MergeFontPackage "MergeFontPackage" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; MergeFontPackage varptr(puchMergeFontBuffer), ulMergeFontBufferSize, varptr(puchFontPackageBuffer), ulFontPackageBufferSize, varptr(ppuchDestBuffer), varptr(pulDestBufferSize), varptr(pulBytesWritten), usMode, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved   ; 戻り値は stat
; puchMergeFontBuffer : BYTE* -> "sptr"
; ulMergeFontBufferSize : DWORD -> "sptr"
; puchFontPackageBuffer : BYTE* -> "sptr"
; ulFontPackageBufferSize : DWORD -> "sptr"
; ppuchDestBuffer : BYTE** in/out -> "sptr"
; pulDestBufferSize : DWORD* in/out -> "sptr"
; pulBytesWritten : DWORD* in/out -> "sptr"
; usMode : WORD -> "sptr"
; lpfnAllocate : CFP_ALLOCPROC -> "sptr"
; lpfnReAllocate : CFP_REALLOCPROC -> "sptr"
; lpfnFree : CFP_FREEPROC -> "sptr"
; lpvReserved : void* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "FONTSUB.dll"
#cfunc global MergeFontPackage "MergeFontPackage" var, int, var, int, var, var, var, int, sptr, sptr, sptr, sptr
; res = MergeFontPackage(puchMergeFontBuffer, ulMergeFontBufferSize, puchFontPackageBuffer, ulFontPackageBufferSize, ppuchDestBuffer, pulDestBufferSize, pulBytesWritten, usMode, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
; puchMergeFontBuffer : BYTE* -> "var"
; ulMergeFontBufferSize : DWORD -> "int"
; puchFontPackageBuffer : BYTE* -> "var"
; ulFontPackageBufferSize : DWORD -> "int"
; ppuchDestBuffer : BYTE** in/out -> "var"
; pulDestBufferSize : DWORD* in/out -> "var"
; pulBytesWritten : DWORD* in/out -> "var"
; usMode : WORD -> "int"
; lpfnAllocate : CFP_ALLOCPROC -> "sptr"
; lpfnReAllocate : CFP_REALLOCPROC -> "sptr"
; lpfnFree : CFP_FREEPROC -> "sptr"
; lpvReserved : void* in/out -> "sptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; DWORD MergeFontPackage(BYTE* puchMergeFontBuffer, DWORD ulMergeFontBufferSize, BYTE* puchFontPackageBuffer, DWORD ulFontPackageBufferSize, BYTE** ppuchDestBuffer, DWORD* pulDestBufferSize, DWORD* pulBytesWritten, WORD usMode, CFP_ALLOCPROC lpfnAllocate, CFP_REALLOCPROC lpfnReAllocate, CFP_FREEPROC lpfnFree, void* lpvReserved)
#uselib "FONTSUB.dll"
#cfunc global MergeFontPackage "MergeFontPackage" var, int, var, int, var, var, var, int, intptr, intptr, intptr, intptr
; res = MergeFontPackage(puchMergeFontBuffer, ulMergeFontBufferSize, puchFontPackageBuffer, ulFontPackageBufferSize, ppuchDestBuffer, pulDestBufferSize, pulBytesWritten, usMode, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
; puchMergeFontBuffer : BYTE* -> "var"
; ulMergeFontBufferSize : DWORD -> "int"
; puchFontPackageBuffer : BYTE* -> "var"
; ulFontPackageBufferSize : DWORD -> "int"
; ppuchDestBuffer : BYTE** in/out -> "var"
; pulDestBufferSize : DWORD* in/out -> "var"
; pulBytesWritten : DWORD* in/out -> "var"
; usMode : WORD -> "int"
; lpfnAllocate : CFP_ALLOCPROC -> "intptr"
; lpfnReAllocate : CFP_REALLOCPROC -> "intptr"
; lpfnFree : CFP_FREEPROC -> "intptr"
; lpvReserved : void* in/out -> "intptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	fontsub = windows.NewLazySystemDLL("FONTSUB.dll")
	procMergeFontPackage = fontsub.NewProc("MergeFontPackage")
)

// puchMergeFontBuffer (BYTE*), ulMergeFontBufferSize (DWORD), puchFontPackageBuffer (BYTE*), ulFontPackageBufferSize (DWORD), ppuchDestBuffer (BYTE** in/out), pulDestBufferSize (DWORD* in/out), pulBytesWritten (DWORD* in/out), usMode (WORD), lpfnAllocate (CFP_ALLOCPROC), lpfnReAllocate (CFP_REALLOCPROC), lpfnFree (CFP_FREEPROC), lpvReserved (void* in/out)
r1, _, err := procMergeFontPackage.Call(
	uintptr(puchMergeFontBuffer),
	uintptr(ulMergeFontBufferSize),
	uintptr(puchFontPackageBuffer),
	uintptr(ulFontPackageBufferSize),
	uintptr(ppuchDestBuffer),
	uintptr(pulDestBufferSize),
	uintptr(pulBytesWritten),
	uintptr(usMode),
	uintptr(lpfnAllocate),
	uintptr(lpfnReAllocate),
	uintptr(lpfnFree),
	uintptr(lpvReserved),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function MergeFontPackage(
  puchMergeFontBuffer: Pointer;   // BYTE*
  ulMergeFontBufferSize: DWORD;   // DWORD
  puchFontPackageBuffer: Pointer;   // BYTE*
  ulFontPackageBufferSize: DWORD;   // DWORD
  ppuchDestBuffer: Pointer;   // BYTE** in/out
  pulDestBufferSize: Pointer;   // DWORD* in/out
  pulBytesWritten: Pointer;   // DWORD* in/out
  usMode: Word;   // WORD
  lpfnAllocate: Pointer;   // CFP_ALLOCPROC
  lpfnReAllocate: Pointer;   // CFP_REALLOCPROC
  lpfnFree: Pointer;   // CFP_FREEPROC
  lpvReserved: Pointer   // void* in/out
): DWORD; cdecl;
  external 'FONTSUB.dll' name 'MergeFontPackage';
result := DllCall("FONTSUB\MergeFontPackage"
    , "Ptr", puchMergeFontBuffer   ; BYTE*
    , "UInt", ulMergeFontBufferSize   ; DWORD
    , "Ptr", puchFontPackageBuffer   ; BYTE*
    , "UInt", ulFontPackageBufferSize   ; DWORD
    , "Ptr", ppuchDestBuffer   ; BYTE** in/out
    , "Ptr", pulDestBufferSize   ; DWORD* in/out
    , "Ptr", pulBytesWritten   ; DWORD* in/out
    , "UShort", usMode   ; WORD
    , "Ptr", lpfnAllocate   ; CFP_ALLOCPROC
    , "Ptr", lpfnReAllocate   ; CFP_REALLOCPROC
    , "Ptr", lpfnFree   ; CFP_FREEPROC
    , "Ptr", lpvReserved   ; void* in/out
    , "Cdecl UInt")   ; return: DWORD
●MergeFontPackage(puchMergeFontBuffer, ulMergeFontBufferSize, puchFontPackageBuffer, ulFontPackageBufferSize, ppuchDestBuffer, pulDestBufferSize, pulBytesWritten, usMode, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved) = DLL("FONTSUB.dll", "dword MergeFontPackage(void*, dword, void*, dword, void*, void*, void*, int, void*, void*, void*, void*)")
# 呼び出し: MergeFontPackage(puchMergeFontBuffer, ulMergeFontBufferSize, puchFontPackageBuffer, ulFontPackageBufferSize, ppuchDestBuffer, pulDestBufferSize, pulBytesWritten, usMode, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
# puchMergeFontBuffer : BYTE* -> "void*"
# ulMergeFontBufferSize : DWORD -> "dword"
# puchFontPackageBuffer : BYTE* -> "void*"
# ulFontPackageBufferSize : DWORD -> "dword"
# ppuchDestBuffer : BYTE** in/out -> "void*"
# pulDestBufferSize : DWORD* in/out -> "void*"
# pulBytesWritten : DWORD* in/out -> "void*"
# usMode : WORD -> "int"
# lpfnAllocate : CFP_ALLOCPROC -> "void*"
# lpfnReAllocate : CFP_REALLOCPROC -> "void*"
# lpfnFree : CFP_FREEPROC -> "void*"
# lpvReserved : void* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※cdecl関数。DLL()宣言はstdcall前提。cdeclは EXEC_PTR(`cdecl`,…) を使用。
const std = @import("std");

extern "fontsub" fn MergeFontPackage(
    puchMergeFontBuffer: [*c]u8, // BYTE*
    ulMergeFontBufferSize: u32, // DWORD
    puchFontPackageBuffer: [*c]u8, // BYTE*
    ulFontPackageBufferSize: u32, // DWORD
    ppuchDestBuffer: [*c][*c]u8, // BYTE** in/out
    pulDestBufferSize: [*c]u32, // DWORD* in/out
    pulBytesWritten: [*c]u32, // DWORD* in/out
    usMode: u16, // WORD
    lpfnAllocate: ?*anyopaque, // CFP_ALLOCPROC
    lpfnReAllocate: ?*anyopaque, // CFP_REALLOCPROC
    lpfnFree: ?*anyopaque, // CFP_FREEPROC
    lpvReserved: ?*anyopaque // void* in/out
) callconv(.c) u32;
proc MergeFontPackage(
    puchMergeFontBuffer: ptr uint8,  # BYTE*
    ulMergeFontBufferSize: uint32,  # DWORD
    puchFontPackageBuffer: ptr uint8,  # BYTE*
    ulFontPackageBufferSize: uint32,  # DWORD
    ppuchDestBuffer: ptr uint8,  # BYTE** in/out
    pulDestBufferSize: ptr uint32,  # DWORD* in/out
    pulBytesWritten: ptr uint32,  # DWORD* in/out
    usMode: uint16,  # WORD
    lpfnAllocate: pointer,  # CFP_ALLOCPROC
    lpfnReAllocate: pointer,  # CFP_REALLOCPROC
    lpfnFree: pointer,  # CFP_FREEPROC
    lpvReserved: pointer  # void* in/out
): uint32 {.importc: "MergeFontPackage", cdecl, dynlib: "FONTSUB.dll".}
pragma(lib, "fontsub");
extern(C)
uint MergeFontPackage(
    ubyte* puchMergeFontBuffer,   // BYTE*
    uint ulMergeFontBufferSize,   // DWORD
    ubyte* puchFontPackageBuffer,   // BYTE*
    uint ulFontPackageBufferSize,   // DWORD
    ubyte** ppuchDestBuffer,   // BYTE** in/out
    uint* pulDestBufferSize,   // DWORD* in/out
    uint* pulBytesWritten,   // DWORD* in/out
    ushort usMode,   // WORD
    void* lpfnAllocate,   // CFP_ALLOCPROC
    void* lpfnReAllocate,   // CFP_REALLOCPROC
    void* lpfnFree,   // CFP_FREEPROC
    void* lpvReserved   // void* in/out
);
ccall((:MergeFontPackage, "FONTSUB.dll"), UInt32,
      (Ptr{UInt8}, UInt32, Ptr{UInt8}, UInt32, Ptr{UInt8}, Ptr{UInt32}, Ptr{UInt32}, UInt16, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}),
      puchMergeFontBuffer, ulMergeFontBufferSize, puchFontPackageBuffer, ulFontPackageBufferSize, ppuchDestBuffer, pulDestBufferSize, pulBytesWritten, usMode, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
# puchMergeFontBuffer : BYTE* -> Ptr{UInt8}
# ulMergeFontBufferSize : DWORD -> UInt32
# puchFontPackageBuffer : BYTE* -> Ptr{UInt8}
# ulFontPackageBufferSize : DWORD -> UInt32
# ppuchDestBuffer : BYTE** in/out -> Ptr{UInt8}
# pulDestBufferSize : DWORD* in/out -> Ptr{UInt32}
# pulBytesWritten : DWORD* in/out -> Ptr{UInt32}
# usMode : WORD -> UInt16
# lpfnAllocate : CFP_ALLOCPROC -> Ptr{Cvoid}
# lpfnReAllocate : CFP_REALLOCPROC -> Ptr{Cvoid}
# lpfnFree : CFP_FREEPROC -> Ptr{Cvoid}
# lpvReserved : void* in/out -> Ptr{Cvoid}
local ffi = require("ffi")
ffi.cdef[[
uint32_t MergeFontPackage(
    uint8_t* puchMergeFontBuffer,
    uint32_t ulMergeFontBufferSize,
    uint8_t* puchFontPackageBuffer,
    uint32_t ulFontPackageBufferSize,
    uint8_t** ppuchDestBuffer,
    uint32_t* pulDestBufferSize,
    uint32_t* pulBytesWritten,
    uint16_t usMode,
    void* lpfnAllocate,
    void* lpfnReAllocate,
    void* lpfnFree,
    void* lpvReserved);
]]
local fontsub = ffi.load("fontsub")
-- fontsub.MergeFontPackage(puchMergeFontBuffer, ulMergeFontBufferSize, puchFontPackageBuffer, ulFontPackageBufferSize, ppuchDestBuffer, pulDestBufferSize, pulBytesWritten, usMode, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
-- puchMergeFontBuffer : BYTE*
-- ulMergeFontBufferSize : DWORD
-- puchFontPackageBuffer : BYTE*
-- ulFontPackageBufferSize : DWORD
-- ppuchDestBuffer : BYTE** in/out
-- pulDestBufferSize : DWORD* in/out
-- pulBytesWritten : DWORD* in/out
-- usMode : WORD
-- lpfnAllocate : CFP_ALLOCPROC
-- lpfnReAllocate : CFP_REALLOCPROC
-- lpfnFree : CFP_FREEPROC
-- lpvReserved : void* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('FONTSUB.dll');
const MergeFontPackage = lib.func('__cdecl', 'MergeFontPackage', 'uint32_t', ['uint8_t *', 'uint32_t', 'uint8_t *', 'uint32_t', 'uint8_t *', 'uint32_t *', 'uint32_t *', 'uint16_t', 'void *', 'void *', 'void *', 'void *']);
// MergeFontPackage(puchMergeFontBuffer, ulMergeFontBufferSize, puchFontPackageBuffer, ulFontPackageBufferSize, ppuchDestBuffer, pulDestBufferSize, pulBytesWritten, usMode, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
// puchMergeFontBuffer : BYTE* -> 'uint8_t *'
// ulMergeFontBufferSize : DWORD -> 'uint32_t'
// puchFontPackageBuffer : BYTE* -> 'uint8_t *'
// ulFontPackageBufferSize : DWORD -> 'uint32_t'
// ppuchDestBuffer : BYTE** in/out -> 'uint8_t *'
// pulDestBufferSize : DWORD* in/out -> 'uint32_t *'
// pulBytesWritten : DWORD* in/out -> 'uint32_t *'
// usMode : WORD -> 'uint16_t'
// lpfnAllocate : CFP_ALLOCPROC -> 'void *'
// lpfnReAllocate : CFP_REALLOCPROC -> 'void *'
// lpfnFree : CFP_FREEPROC -> 'void *'
// lpvReserved : void* in/out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
// コールバック(関数ポインタ)は koffi.proto/koffi.register で型を定義して渡す(素の void* では JS 関数を渡せない)。
const lib = Deno.dlopen("FONTSUB.dll", {
  MergeFontPackage: { parameters: ["pointer", "u32", "pointer", "u32", "pointer", "pointer", "pointer", "u16", "pointer", "pointer", "pointer", "pointer"], result: "u32" },
});
// lib.symbols.MergeFontPackage(puchMergeFontBuffer, ulMergeFontBufferSize, puchFontPackageBuffer, ulFontPackageBufferSize, ppuchDestBuffer, pulDestBufferSize, pulBytesWritten, usMode, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
// puchMergeFontBuffer : BYTE* -> "pointer"
// ulMergeFontBufferSize : DWORD -> "u32"
// puchFontPackageBuffer : BYTE* -> "pointer"
// ulFontPackageBufferSize : DWORD -> "u32"
// ppuchDestBuffer : BYTE** in/out -> "pointer"
// pulDestBufferSize : DWORD* in/out -> "pointer"
// pulBytesWritten : DWORD* in/out -> "pointer"
// usMode : WORD -> "u16"
// lpfnAllocate : CFP_ALLOCPROC -> "pointer"
// lpfnReAllocate : CFP_REALLOCPROC -> "pointer"
// lpfnFree : CFP_FREEPROC -> "pointer"
// lpvReserved : void* in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t MergeFontPackage(
    uint8_t* puchMergeFontBuffer,
    uint32_t ulMergeFontBufferSize,
    uint8_t* puchFontPackageBuffer,
    uint32_t ulFontPackageBufferSize,
    uint8_t** ppuchDestBuffer,
    uint32_t* pulDestBufferSize,
    uint32_t* pulBytesWritten,
    uint16_t usMode,
    void* lpfnAllocate,
    void* lpfnReAllocate,
    void* lpfnFree,
    void* lpvReserved);
C, "FONTSUB.dll");
// $ffi->MergeFontPackage(puchMergeFontBuffer, ulMergeFontBufferSize, puchFontPackageBuffer, ulFontPackageBufferSize, ppuchDestBuffer, pulDestBufferSize, pulBytesWritten, usMode, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved);
// puchMergeFontBuffer : BYTE*
// ulMergeFontBufferSize : DWORD
// puchFontPackageBuffer : BYTE*
// ulFontPackageBufferSize : DWORD
// ppuchDestBuffer : BYTE** in/out
// pulDestBufferSize : DWORD* in/out
// pulBytesWritten : DWORD* in/out
// usMode : WORD
// lpfnAllocate : CFP_ALLOCPROC
// lpfnReAllocate : CFP_REALLOCPROC
// lpfnFree : CFP_FREEPROC
// lpvReserved : void* 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 Fontsub extends Library {
    Fontsub INSTANCE = Native.load("fontsub", Fontsub.class);
    int MergeFontPackage(
        byte[] puchMergeFontBuffer,   // BYTE*
        int ulMergeFontBufferSize,   // DWORD
        byte[] puchFontPackageBuffer,   // BYTE*
        int ulFontPackageBufferSize,   // DWORD
        Pointer ppuchDestBuffer,   // BYTE** in/out
        IntByReference pulDestBufferSize,   // DWORD* in/out
        IntByReference pulBytesWritten,   // DWORD* in/out
        short usMode,   // WORD
        Callback lpfnAllocate,   // CFP_ALLOCPROC
        Callback lpfnReAllocate,   // CFP_REALLOCPROC
        Callback lpfnFree,   // CFP_FREEPROC
        Pointer lpvReserved   // void* in/out
    );
}
@[Link("fontsub")]
lib LibFONTSUB
  fun MergeFontPackage = MergeFontPackage(
    puchMergeFontBuffer : UInt8*,   # BYTE*
    ulMergeFontBufferSize : UInt32,   # DWORD
    puchFontPackageBuffer : UInt8*,   # BYTE*
    ulFontPackageBufferSize : UInt32,   # DWORD
    ppuchDestBuffer : UInt8**,   # BYTE** in/out
    pulDestBufferSize : UInt32*,   # DWORD* in/out
    pulBytesWritten : UInt32*,   # DWORD* in/out
    usMode : UInt16,   # WORD
    lpfnAllocate : Void*,   # CFP_ALLOCPROC
    lpfnReAllocate : Void*,   # CFP_REALLOCPROC
    lpfnFree : Void*,   # CFP_FREEPROC
    lpvReserved : Void*   # void* in/out
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef MergeFontPackageNative = Uint32 Function(Pointer<Uint8>, Uint32, Pointer<Uint8>, Uint32, Pointer<Uint8>, Pointer<Uint32>, Pointer<Uint32>, Uint16, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
typedef MergeFontPackageDart = int Function(Pointer<Uint8>, int, Pointer<Uint8>, int, Pointer<Uint8>, Pointer<Uint32>, Pointer<Uint32>, int, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
final MergeFontPackage = DynamicLibrary.open('FONTSUB.dll')
    .lookupFunction<MergeFontPackageNative, MergeFontPackageDart>('MergeFontPackage');
// puchMergeFontBuffer : BYTE* -> Pointer<Uint8>
// ulMergeFontBufferSize : DWORD -> Uint32
// puchFontPackageBuffer : BYTE* -> Pointer<Uint8>
// ulFontPackageBufferSize : DWORD -> Uint32
// ppuchDestBuffer : BYTE** in/out -> Pointer<Uint8>
// pulDestBufferSize : DWORD* in/out -> Pointer<Uint32>
// pulBytesWritten : DWORD* in/out -> Pointer<Uint32>
// usMode : WORD -> Uint16
// lpfnAllocate : CFP_ALLOCPROC -> Pointer<Void>
// lpfnReAllocate : CFP_REALLOCPROC -> Pointer<Void>
// lpfnFree : CFP_FREEPROC -> Pointer<Void>
// lpvReserved : void* in/out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function MergeFontPackage(
  puchMergeFontBuffer: Pointer;   // BYTE*
  ulMergeFontBufferSize: DWORD;   // DWORD
  puchFontPackageBuffer: Pointer;   // BYTE*
  ulFontPackageBufferSize: DWORD;   // DWORD
  ppuchDestBuffer: Pointer;   // BYTE** in/out
  pulDestBufferSize: Pointer;   // DWORD* in/out
  pulBytesWritten: Pointer;   // DWORD* in/out
  usMode: Word;   // WORD
  lpfnAllocate: Pointer;   // CFP_ALLOCPROC
  lpfnReAllocate: Pointer;   // CFP_REALLOCPROC
  lpfnFree: Pointer;   // CFP_FREEPROC
  lpvReserved: Pointer   // void* in/out
): DWORD; cdecl;
  external 'FONTSUB.dll' name 'MergeFontPackage';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import ccall safe "MergeFontPackage"
  c_MergeFontPackage :: Ptr Word8 -> Word32 -> Ptr Word8 -> Word32 -> Ptr Word8 -> Ptr Word32 -> Ptr Word32 -> Word16 -> Ptr () -> Ptr () -> Ptr () -> Ptr () -> IO Word32
-- puchMergeFontBuffer : BYTE* -> Ptr Word8
-- ulMergeFontBufferSize : DWORD -> Word32
-- puchFontPackageBuffer : BYTE* -> Ptr Word8
-- ulFontPackageBufferSize : DWORD -> Word32
-- ppuchDestBuffer : BYTE** in/out -> Ptr Word8
-- pulDestBufferSize : DWORD* in/out -> Ptr Word32
-- pulBytesWritten : DWORD* in/out -> Ptr Word32
-- usMode : WORD -> Word16
-- lpfnAllocate : CFP_ALLOCPROC -> Ptr ()
-- lpfnReAllocate : CFP_REALLOCPROC -> Ptr ()
-- lpfnFree : CFP_FREEPROC -> Ptr ()
-- lpvReserved : void* in/out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let mergefontpackage =
  foreign "MergeFontPackage"
    ((ptr uint8_t) @-> uint32_t @-> (ptr uint8_t) @-> uint32_t @-> (ptr uint8_t) @-> (ptr uint32_t) @-> (ptr uint32_t) @-> uint16_t @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> returning uint32_t)
(* puchMergeFontBuffer : BYTE* -> (ptr uint8_t) *)
(* ulMergeFontBufferSize : DWORD -> uint32_t *)
(* puchFontPackageBuffer : BYTE* -> (ptr uint8_t) *)
(* ulFontPackageBufferSize : DWORD -> uint32_t *)
(* ppuchDestBuffer : BYTE** in/out -> (ptr uint8_t) *)
(* pulDestBufferSize : DWORD* in/out -> (ptr uint32_t) *)
(* pulBytesWritten : DWORD* in/out -> (ptr uint32_t) *)
(* usMode : WORD -> uint16_t *)
(* lpfnAllocate : CFP_ALLOCPROC -> (ptr void) *)
(* lpfnReAllocate : CFP_REALLOCPROC -> (ptr void) *)
(* lpfnFree : CFP_FREEPROC -> (ptr void) *)
(* lpvReserved : void* in/out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library fontsub (t "FONTSUB.dll"))
(cffi:use-foreign-library fontsub)

(cffi:defcfun ("MergeFontPackage" merge-font-package :convention :cdecl) :uint32
  (puch-merge-font-buffer :pointer)   ; BYTE*
  (ul-merge-font-buffer-size :uint32)   ; DWORD
  (puch-font-package-buffer :pointer)   ; BYTE*
  (ul-font-package-buffer-size :uint32)   ; DWORD
  (ppuch-dest-buffer :pointer)   ; BYTE** in/out
  (pul-dest-buffer-size :pointer)   ; DWORD* in/out
  (pul-bytes-written :pointer)   ; DWORD* in/out
  (us-mode :uint16)   ; WORD
  (lpfn-allocate :pointer)   ; CFP_ALLOCPROC
  (lpfn-re-allocate :pointer)   ; CFP_REALLOCPROC
  (lpfn-free :pointer)   ; CFP_FREEPROC
  (lpv-reserved :pointer))   ; void* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $MergeFontPackage = Win32::API::More->new('FONTSUB',
    'DWORD MergeFontPackage(LPVOID puchMergeFontBuffer, DWORD ulMergeFontBufferSize, LPVOID puchFontPackageBuffer, DWORD ulFontPackageBufferSize, LPVOID ppuchDestBuffer, LPVOID pulDestBufferSize, LPVOID pulBytesWritten, WORD usMode, LPVOID lpfnAllocate, LPVOID lpfnReAllocate, LPVOID lpfnFree, LPVOID lpvReserved)');
# my $ret = $MergeFontPackage->Call($puchMergeFontBuffer, $ulMergeFontBufferSize, $puchFontPackageBuffer, $ulFontPackageBufferSize, $ppuchDestBuffer, $pulDestBufferSize, $pulBytesWritten, $usMode, $lpfnAllocate, $lpfnReAllocate, $lpfnFree, $lpvReserved);
# puchMergeFontBuffer : BYTE* -> LPVOID
# ulMergeFontBufferSize : DWORD -> DWORD
# puchFontPackageBuffer : BYTE* -> LPVOID
# ulFontPackageBufferSize : DWORD -> DWORD
# ppuchDestBuffer : BYTE** in/out -> LPVOID
# pulDestBufferSize : DWORD* in/out -> LPVOID
# pulBytesWritten : DWORD* in/out -> LPVOID
# usMode : WORD -> WORD
# lpfnAllocate : CFP_ALLOCPROC -> LPVOID
# lpfnReAllocate : CFP_REALLOCPROC -> LPVOID
# lpfnFree : CFP_FREEPROC -> LPVOID
# lpvReserved : void* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# コールバック(関数ポインタ)は Perl sub を直接渡せません。Win32::API::Callback を使用してください。

関連項目

公式の関連項目
使用する型