MergeFontPackage
関数シグネチャ
// 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
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| puchMergeFontBuffer | BYTE* | in | マージ対象のフォントを格納したバッファへのポインターです。これは usMode が TTFMFP_DELTA の場合にのみ使用されます。 | ||||||||
| ulMergeFontBufferSize | DWORD | in | *puchMergeFontBuffer のサイズをバイト単位で指定します。 | ||||||||
| puchFontPackageBuffer | BYTE* | in | フォントパッケージを格納したバッファへのポインターです。 | ||||||||
| ulFontPackageBufferSize | DWORD | in | *puchMergeFontBuffer のサイズをバイト単位で指定します。 | ||||||||
| ppuchDestBuffer | BYTE** | inout | unsigned char* 型の変数へのポインターです。MergeFontPackage 関数は、lpfnAllocate および lpfnReAllocate を使用してバッファ **ppuchDestBuffer を割り当てます。正常に復帰すると、そのバッファにはマージまたは展開された結果のフォントが格納されます。最終的にそのバッファを解放するのはアプリケーションの責任です。 | ||||||||
| pulDestBufferSize | DWORD* | inout | unsigned long を指します。正常に復帰すると、割り当てられたバッファ **ppuchDestBuffer のサイズが格納されます。 | ||||||||
| pulBytesWritten | DWORD* | inout | unsigned long を指します。正常に復帰すると、バッファ **ppuchDestBuffer で実際に使用されたバイト数が格納されます。 | ||||||||
| usMode | WORD | in | 実行する処理の種類を指定します。次のいずれかの値を選択してください。これらは組み合わせることはできません。
| ||||||||
| lpfnAllocate | CFP_ALLOCPROC | in | ppuchDestBuffer および一時バッファのための初期メモリを割り当てるコールバック関数です。 | ||||||||
| lpfnReAllocate | CFP_REALLOCPROC | in | ppuchDestBuffer および一時バッファのためのメモリを再割り当てするコールバック関数です。 | ||||||||
| lpfnFree | CFP_FREEPROC | in | lpfnAllocate および lpfnReAllocate によって割り当てられたメモリを解放するコールバック関数です。 | ||||||||
| lpvReserved | void* | inout | NULL を設定する必要があります。 |
戻り値の型: DWORD
公式ドキュメント
MergeFontPackage 関数は、CreateFontPackage によって作成されたフォントを操作します。
戻り値
関数が成功した場合は、ゼロを返します。
それ以外の場合は、ゼロ以外の値を返します。返される可能性のあるエラーについては、フォントパッケージ関数のエラーメッセージ を参照してください。
解説(Remarks)
この関数は、それぞれがサブセットフォントを表す、4 つの異なる関連したエンティティを扱います。
| エンティティ | 生成元 | フォントとして直接使用可能か |
|---|---|---|
| 単純なワーキングフォント | usSubsetFormat を TFCFP_SUBSET に設定した CreateFontPackage。 | はい |
| フォントパッケージ | usSubsetFormat を TTFCFP_SUBSET1 に設定した CreateFontPackage。 | いいえ |
| Delta フォントパッケージ | usSubsetFormat を TTFCFP_DELTA に設定した CreateFontPackage。 | いいえ |
| マージ可能なワーキングフォント | usMode を TTFMFP_SUBSET1 または TTFMFP_DELTA に設定した MergeFontPackage。 | はい |
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 方式にも切替可。#uselib "FONTSUB.dll" #cfunc global MergeFontPackage "MergeFontPackage" sptr, int, sptr, int, sptr, sptr, sptr, int, sptr, sptr, sptr, sptr ; res = MergeFontPackage(varptr(puchMergeFontBuffer), ulMergeFontBufferSize, varptr(puchFontPackageBuffer), ulFontPackageBufferSize, varptr(ppuchDestBuffer), varptr(pulDestBufferSize), varptr(pulBytesWritten), usMode, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved) ; puchMergeFontBuffer : BYTE* -> "sptr" ; ulMergeFontBufferSize : DWORD -> "int" ; puchFontPackageBuffer : BYTE* -> "sptr" ; ulFontPackageBufferSize : DWORD -> "int" ; ppuchDestBuffer : BYTE** in/out -> "sptr" ; pulDestBufferSize : DWORD* in/out -> "sptr" ; pulBytesWritten : DWORD* in/out -> "sptr" ; usMode : WORD -> "int" ; lpfnAllocate : CFP_ALLOCPROC -> "sptr" ; lpfnReAllocate : CFP_REALLOCPROC -> "sptr" ; lpfnFree : CFP_FREEPROC -> "sptr" ; lpvReserved : void* in/out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは 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 方式にも切替可。; 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" intptr, int, intptr, int, intptr, intptr, intptr, int, intptr, intptr, intptr, intptr ; res = MergeFontPackage(varptr(puchMergeFontBuffer), ulMergeFontBufferSize, varptr(puchFontPackageBuffer), ulFontPackageBufferSize, varptr(ppuchDestBuffer), varptr(pulDestBufferSize), varptr(pulBytesWritten), usMode, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved) ; puchMergeFontBuffer : BYTE* -> "intptr" ; ulMergeFontBufferSize : DWORD -> "int" ; puchFontPackageBuffer : BYTE* -> "intptr" ; ulFontPackageBufferSize : DWORD -> "int" ; ppuchDestBuffer : BYTE** in/out -> "intptr" ; pulDestBufferSize : DWORD* in/out -> "intptr" ; pulBytesWritten : DWORD* in/out -> "intptr" ; usMode : WORD -> "int" ; lpfnAllocate : CFP_ALLOCPROC -> "intptr" ; lpfnReAllocate : CFP_REALLOCPROC -> "intptr" ; lpfnFree : CFP_FREEPROC -> "intptr" ; lpvReserved : void* in/out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは 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 // DWORDfunction 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 を使用してください。関連項目
- f CreateFontPackage — TrueTypeフォントのサブセット化フォントパッケージを作成する。