Win32 API 日本語リファレンス
ホーム › Storage.Jet › JetOpenTempTable3

JetOpenTempTable3

関数
Unicodeインデックス指定付きで一時テーブルを開く。
DLLESENT.dll呼出規約winapi

シグネチャ

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

INT JetOpenTempTable3(
    JET_SESID sesid,
    const JET_COLUMNDEF* prgcolumndef,
    DWORD ccolumn,
    JET_UNICODEINDEX* pidxunicode,   // optional
    DWORD grbit,
    JET_TABLEID* ptableid,
    DWORD* prgcolumnid
);

パラメーター

名前型方向説明
sesidJET_SESIDin一時テーブル作成を行うセッションのJET_SESIDハンドル。
prgcolumndefJET_COLUMNDEF*in一時テーブルの列定義を保持するJET_COLUMNDEF配列のポインタ。
ccolumnDWORDinprgcolumndef配列の列数を指定する値。
pidxunicodeJET_UNICODEINDEX*inoptionalUnicode並べ替えのロケールと正規化オプションを指定するJET_UNICODEINDEX構造体ポインタ。NULL可。
grbitDWORDin一時テーブル動作を制御するビットフラグ。並べ替えや一意性などを指定する。
ptableidJET_TABLEID*out作成された一時テーブルのカーソルを受け取る出力ポインタ(JET_TABLEID)。
prgcolumnidDWORD*out各列に割り当てられた列IDを受け取るDWORD配列の出力ポインタ。

戻り値の型: INT

公式ドキュメント

JetOpenTempTable3 関数は、単一のインデックスを持つ一時テーブルを作成します。この一時テーブルは、JetCreateTableColumnIndex で作成された通常のテーブルと同じようにレコードの格納と取得に使用できます。ただし、一時テーブルは揮発性であるため、通常のテーブルよりもはるかに高速です。また、完全にシーケンシャルな方法でアクセスする場合には、レコードセットの並べ替えや重複除去を非常に高速に行うためにも使用できます。

戻り値

この関数は、次のいずれかの戻りコードを含む JET_ERR データ型を返します。発生し得る ESE エラーの詳細については、Extensible Storage Engine Errors および Error Handling Parameters を参照してください。

戻りコード

説明

JET_errSuccess

操作は正常に完了しました。

JET_errCannotMaterializeForwardOnlySort

JET_bitTTForwardOnly が指定されていましたが、指定された内容の一時テーブルを前方専用の最適化を使用して作成できなかったため、JetOpenTempTable3 は失敗しました。このエラーは Windows Server 2003 以降のリリースでのみ返されます。

JET_errClientRequestToStopJetService

JetStopService の呼び出しの結果、セッションに関連付けられたインスタンス上のすべての動作が停止しているため、操作を完了できません。

JET_errIndexInvalidDef

無効なインデックス定義が指定されたため、インデックスを作成できませんでした。JetOpenTempTable3 は次の場合にこのエラーを返します。

  • Language Neutral ロケールが指定された場合。

  • 無効な正規化フラグの組み合わせが指定された場合。

このエラーは Windows 2000 でのみ返されます。

JET_errInstanceUnavailable

セッションに関連付けられたインスタンスで、データの整合性を保護するためにすべてのデータへのアクセスを取り消す必要がある致命的なエラーが発生したため、操作を完了できません。このエラーは Windows XP 以降のリリースでのみ返されます。

JET_errInvalidCodePage

JET_COLUMNDEF 構造体の cp メンバーに有効なコードページが設定されていませんでした。テキスト列で有効な値は英語 (1252) と Unicode (1200) のみです。値 0 は既定値 (英語、1252) が使用されることを意味します。

JET_errInvalidColumnType

JET_COLUMNDEF 構造体の coltyp メンバーに有効な列の型が設定されていませんでした。

JET_errInvalidLanguageId

無効なロケール ID を使用しようとしたため、インデックスを作成できませんでした。ロケール ID が完全に無効であるか、関連する言語パックがインストールされていない可能性があります。

JET_errInvalidLCMapStringFlags

無効な正規化フラグの組み合わせを使用しようとしたため、インデックスを作成できませんでした。このエラーは Windows XP 以降のリリースでのみ返されます。Windows 2000 では、無効な正規化フラグの場合は代わりに JET_errIndexInvalidDef が返されます。

JET_errInvalidSesid

セッションハンドルが無効であるか、閉じられたセッションを参照しています。このエラーはすべての状況で返されるわけではありません。ハンドルの検証はベストエフォートでのみ行われます。

JET_errNotInitialized

セッションに関連付けられたインスタンスがまだ初期化されていないため、操作を完了できません。

JET_errOutOfCursors

新しいカーソルを開くために必要なリソースをエンジンが割り当てられないため、操作は失敗しました。カーソルのリソースは、JetSetSystemParameter に JET_paramMaxCursors を指定して構成します。

JET_errOutOfMemory

操作を完了するのに十分なメモリを割り当てられなかったため、操作は失敗しました。

ホストプロセスのアドレス空間の断片化が進みすぎた場合、JetOpenTempTable3 は JET_errOutOfMemory を返すことがあります。一時テーブルマネージャーは、格納するデータ量にかかわらず、作成される一時テーブルごとに常に 1MB のアドレス空間を割り当てます。

JET_errRestoreInProgress

セッションに関連付けられたインスタンスで復元操作が進行中であるため、操作を完了できません。

JET_errSessionSharingViolation

同じセッションを同時に複数のスレッドで使用することはできません。

このエラーは Windows XP 以降のリリースでのみ返されます。

JET_errTermInProgress

セッションに関連付けられたインスタンスがシャットダウン中であるため、操作を完了できません。

JET_errTooManyColumns

テーブルに多すぎる列を追加しようとしました。1 つのテーブルに持てるのは、固定長列が JET_ccolFixedMost 個まで、可変長列が JET_ccolVarMost 個まで、タグ付き列が JET_ccolTaggedMost 個までです。

JET_errTooManyOpenIndexes

テーブルのインデックスをキャッシュするために必要なリソースをエンジンが割り当てられないため、操作は失敗しました。スキーマをキャッシュできるインデックスの数は、JetSetSystemParameter に JET_paramMaxOpenTables を指定して構成します。

JET_errTooManyOpenTables

テーブルのスキーマをキャッシュするために必要なリソースをエンジンが割り当てられないため、操作は失敗しました。スキーマをキャッシュできるテーブルの数は、JetSetSystemParameter に JET_paramMaxOpenTables を指定して構成します。

JET_errTooManySorts

一時テーブルを作成するために必要なリソースをエンジンが割り当てられないため、操作は失敗しました。一時テーブルのリソースは、JetSetSystemParameter に JET_paramMaxTemporaryTables を指定して構成します。

成功した場合、新しく作成された一時テーブル上に開かれたカーソルが返されます。一時データベースの状態は、新しい一時テーブルを格納できるように準備されます。データベースエンジンが使用している通常のデータベースの状態は変更されません。

失敗した場合、一時テーブルは作成されず、カーソルも返されません。一時データベースの状態は変更される場合があります。データベースエンジンが使用している通常のデータベースの状態は変更されません。

要件

要件 値

クライアント

Windows Vista、Windows XP、または Windows 2000 Professional が必要です。

サーバー

Windows Server 2008、Windows Server 2003、または Windows 2000 Server が必要です。

ヘッダー

Esent.h で宣言されています。

ライブラリ

ESENT.lib を使用します。

DLL

ESENT.dll が必要です。

関連項目

Extensible Storage Engine Errors
Error Handling Parameters
JET_COLUMNDEF
JET_COLUMNID
JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JET_UNICODEINDEX
JetCloseTable
JetCreateTableColumnIndex
JetDupCursor
JetMove
JetOpenTempTable
JetRollback
JetSeek
JetSetSystemParameter
System Parameters

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp)

各言語での呼び出し定義

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

INT JetOpenTempTable3(
    JET_SESID sesid,
    const JET_COLUMNDEF* prgcolumndef,
    DWORD ccolumn,
    JET_UNICODEINDEX* pidxunicode,   // optional
    DWORD grbit,
    JET_TABLEID* ptableid,
    DWORD* prgcolumnid
);
[DllImport("ESENT.dll", ExactSpelling = true)]
static extern int JetOpenTempTable3(
    UIntPtr sesid,   // JET_SESID
    IntPtr prgcolumndef,   // JET_COLUMNDEF*
    uint ccolumn,   // DWORD
    IntPtr pidxunicode,   // JET_UNICODEINDEX* optional
    uint grbit,   // DWORD
    out UIntPtr ptableid,   // JET_TABLEID* out
    out uint prgcolumnid   // DWORD* out
);
<DllImport("ESENT.dll", ExactSpelling:=True)>
Public Shared Function JetOpenTempTable3(
    sesid As UIntPtr,   ' JET_SESID
    prgcolumndef As IntPtr,   ' JET_COLUMNDEF*
    ccolumn As UInteger,   ' DWORD
    pidxunicode As IntPtr,   ' JET_UNICODEINDEX* optional
    grbit As UInteger,   ' DWORD
    <Out> ByRef ptableid As UIntPtr,   ' JET_TABLEID* out
    <Out> ByRef prgcolumnid As UInteger   ' DWORD* out
) As Integer
End Function
' sesid : JET_SESID
' prgcolumndef : JET_COLUMNDEF*
' ccolumn : DWORD
' pidxunicode : JET_UNICODEINDEX* optional
' grbit : DWORD
' ptableid : JET_TABLEID* out
' prgcolumnid : DWORD* out
Declare PtrSafe Function JetOpenTempTable3 Lib "esent" ( _
    ByVal sesid As LongPtr, _
    ByVal prgcolumndef As LongPtr, _
    ByVal ccolumn As Long, _
    ByVal pidxunicode As LongPtr, _
    ByVal grbit As Long, _
    ByRef ptableid As LongPtr, _
    ByRef prgcolumnid As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

JetOpenTempTable3 = ctypes.windll.esent.JetOpenTempTable3
JetOpenTempTable3.restype = ctypes.c_int
JetOpenTempTable3.argtypes = [
    ctypes.c_size_t,  # sesid : JET_SESID
    ctypes.c_void_p,  # prgcolumndef : JET_COLUMNDEF*
    wintypes.DWORD,  # ccolumn : DWORD
    ctypes.c_void_p,  # pidxunicode : JET_UNICODEINDEX* optional
    wintypes.DWORD,  # grbit : DWORD
    ctypes.c_void_p,  # ptableid : JET_TABLEID* out
    ctypes.POINTER(wintypes.DWORD),  # prgcolumnid : DWORD* out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('ESENT.dll')
JetOpenTempTable3 = Fiddle::Function.new(
  lib['JetOpenTempTable3'],
  [
    Fiddle::TYPE_UINTPTR_T,  # sesid : JET_SESID
    Fiddle::TYPE_VOIDP,  # prgcolumndef : JET_COLUMNDEF*
    -Fiddle::TYPE_INT,  # ccolumn : DWORD
    Fiddle::TYPE_VOIDP,  # pidxunicode : JET_UNICODEINDEX* optional
    -Fiddle::TYPE_INT,  # grbit : DWORD
    Fiddle::TYPE_VOIDP,  # ptableid : JET_TABLEID* out
    Fiddle::TYPE_VOIDP,  # prgcolumnid : DWORD* out
  ],
  Fiddle::TYPE_INT)
#[link(name = "esent")]
extern "system" {
    fn JetOpenTempTable3(
        sesid: usize,  // JET_SESID
        prgcolumndef: *const JET_COLUMNDEF,  // JET_COLUMNDEF*
        ccolumn: u32,  // DWORD
        pidxunicode: *mut JET_UNICODEINDEX,  // JET_UNICODEINDEX* optional
        grbit: u32,  // DWORD
        ptableid: *mut usize,  // JET_TABLEID* out
        prgcolumnid: *mut u32  // DWORD* out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("ESENT.dll")]
public static extern int JetOpenTempTable3(UIntPtr sesid, IntPtr prgcolumndef, uint ccolumn, IntPtr pidxunicode, uint grbit, out UIntPtr ptableid, out uint prgcolumnid);
"@
$api = Add-Type -MemberDefinition $sig -Name 'ESENT_JetOpenTempTable3' -Namespace Win32 -PassThru
# $api::JetOpenTempTable3(sesid, prgcolumndef, ccolumn, pidxunicode, grbit, ptableid, prgcolumnid)
#uselib "ESENT.dll"
#func global JetOpenTempTable3 "JetOpenTempTable3" sptr, sptr, sptr, sptr, sptr, sptr, sptr
; JetOpenTempTable3 sesid, varptr(prgcolumndef), ccolumn, varptr(pidxunicode), grbit, varptr(ptableid), varptr(prgcolumnid)   ; 戻り値は stat
; sesid : JET_SESID -> "sptr"
; prgcolumndef : JET_COLUMNDEF* -> "sptr"
; ccolumn : DWORD -> "sptr"
; pidxunicode : JET_UNICODEINDEX* optional -> "sptr"
; grbit : DWORD -> "sptr"
; ptableid : JET_TABLEID* out -> "sptr"
; prgcolumnid : DWORD* out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "ESENT.dll"
#cfunc global JetOpenTempTable3 "JetOpenTempTable3" sptr, var, int, var, int, var, var
; res = JetOpenTempTable3(sesid, prgcolumndef, ccolumn, pidxunicode, grbit, ptableid, prgcolumnid)
; sesid : JET_SESID -> "sptr"
; prgcolumndef : JET_COLUMNDEF* -> "var"
; ccolumn : DWORD -> "int"
; pidxunicode : JET_UNICODEINDEX* optional -> "var"
; grbit : DWORD -> "int"
; ptableid : JET_TABLEID* out -> "var"
; prgcolumnid : DWORD* out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; INT JetOpenTempTable3(JET_SESID sesid, JET_COLUMNDEF* prgcolumndef, DWORD ccolumn, JET_UNICODEINDEX* pidxunicode, DWORD grbit, JET_TABLEID* ptableid, DWORD* prgcolumnid)
#uselib "ESENT.dll"
#cfunc global JetOpenTempTable3 "JetOpenTempTable3" intptr, var, int, var, int, var, var
; res = JetOpenTempTable3(sesid, prgcolumndef, ccolumn, pidxunicode, grbit, ptableid, prgcolumnid)
; sesid : JET_SESID -> "intptr"
; prgcolumndef : JET_COLUMNDEF* -> "var"
; ccolumn : DWORD -> "int"
; pidxunicode : JET_UNICODEINDEX* optional -> "var"
; grbit : DWORD -> "int"
; ptableid : JET_TABLEID* out -> "var"
; prgcolumnid : DWORD* out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	esent = windows.NewLazySystemDLL("ESENT.dll")
	procJetOpenTempTable3 = esent.NewProc("JetOpenTempTable3")
)

// sesid (JET_SESID), prgcolumndef (JET_COLUMNDEF*), ccolumn (DWORD), pidxunicode (JET_UNICODEINDEX* optional), grbit (DWORD), ptableid (JET_TABLEID* out), prgcolumnid (DWORD* out)
r1, _, err := procJetOpenTempTable3.Call(
	uintptr(sesid),
	uintptr(prgcolumndef),
	uintptr(ccolumn),
	uintptr(pidxunicode),
	uintptr(grbit),
	uintptr(ptableid),
	uintptr(prgcolumnid),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // INT
function JetOpenTempTable3(
  sesid: NativeUInt;   // JET_SESID
  prgcolumndef: Pointer;   // JET_COLUMNDEF*
  ccolumn: DWORD;   // DWORD
  pidxunicode: Pointer;   // JET_UNICODEINDEX* optional
  grbit: DWORD;   // DWORD
  ptableid: Pointer;   // JET_TABLEID* out
  prgcolumnid: Pointer   // DWORD* out
): Integer; stdcall;
  external 'ESENT.dll' name 'JetOpenTempTable3';
result := DllCall("ESENT\JetOpenTempTable3"
    , "UPtr", sesid   ; JET_SESID
    , "Ptr", prgcolumndef   ; JET_COLUMNDEF*
    , "UInt", ccolumn   ; DWORD
    , "Ptr", pidxunicode   ; JET_UNICODEINDEX* optional
    , "UInt", grbit   ; DWORD
    , "Ptr", ptableid   ; JET_TABLEID* out
    , "Ptr", prgcolumnid   ; DWORD* out
    , "Int")   ; return: INT
●JetOpenTempTable3(sesid, prgcolumndef, ccolumn, pidxunicode, grbit, ptableid, prgcolumnid) = DLL("ESENT.dll", "int JetOpenTempTable3(int, void*, dword, void*, dword, void*, void*)")
# 呼び出し: JetOpenTempTable3(sesid, prgcolumndef, ccolumn, pidxunicode, grbit, ptableid, prgcolumnid)
# sesid : JET_SESID -> "int"
# prgcolumndef : JET_COLUMNDEF* -> "void*"
# ccolumn : DWORD -> "dword"
# pidxunicode : JET_UNICODEINDEX* optional -> "void*"
# grbit : DWORD -> "dword"
# ptableid : JET_TABLEID* out -> "void*"
# prgcolumnid : DWORD* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "esent" fn JetOpenTempTable3(
    sesid: usize, // JET_SESID
    prgcolumndef: [*c]JET_COLUMNDEF, // JET_COLUMNDEF*
    ccolumn: u32, // DWORD
    pidxunicode: [*c]JET_UNICODEINDEX, // JET_UNICODEINDEX* optional
    grbit: u32, // DWORD
    ptableid: [*c]usize, // JET_TABLEID* out
    prgcolumnid: [*c]u32 // DWORD* out
) callconv(std.os.windows.WINAPI) i32;
proc JetOpenTempTable3(
    sesid: uint,  # JET_SESID
    prgcolumndef: ptr JET_COLUMNDEF,  # JET_COLUMNDEF*
    ccolumn: uint32,  # DWORD
    pidxunicode: ptr JET_UNICODEINDEX,  # JET_UNICODEINDEX* optional
    grbit: uint32,  # DWORD
    ptableid: ptr uint,  # JET_TABLEID* out
    prgcolumnid: ptr uint32  # DWORD* out
): int32 {.importc: "JetOpenTempTable3", stdcall, dynlib: "ESENT.dll".}
pragma(lib, "esent");
extern(Windows)
int JetOpenTempTable3(
    size_t sesid,   // JET_SESID
    JET_COLUMNDEF* prgcolumndef,   // JET_COLUMNDEF*
    uint ccolumn,   // DWORD
    JET_UNICODEINDEX* pidxunicode,   // JET_UNICODEINDEX* optional
    uint grbit,   // DWORD
    size_t* ptableid,   // JET_TABLEID* out
    uint* prgcolumnid   // DWORD* out
);
ccall((:JetOpenTempTable3, "ESENT.dll"), stdcall, Int32,
      (Csize_t, Ptr{JET_COLUMNDEF}, UInt32, Ptr{JET_UNICODEINDEX}, UInt32, Ptr{Csize_t}, Ptr{UInt32}),
      sesid, prgcolumndef, ccolumn, pidxunicode, grbit, ptableid, prgcolumnid)
# sesid : JET_SESID -> Csize_t
# prgcolumndef : JET_COLUMNDEF* -> Ptr{JET_COLUMNDEF}
# ccolumn : DWORD -> UInt32
# pidxunicode : JET_UNICODEINDEX* optional -> Ptr{JET_UNICODEINDEX}
# grbit : DWORD -> UInt32
# ptableid : JET_TABLEID* out -> Ptr{Csize_t}
# prgcolumnid : DWORD* out -> Ptr{UInt32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t JetOpenTempTable3(
    uintptr_t sesid,
    void* prgcolumndef,
    uint32_t ccolumn,
    void* pidxunicode,
    uint32_t grbit,
    uintptr_t* ptableid,
    uint32_t* prgcolumnid);
]]
local esent = ffi.load("esent")
-- esent.JetOpenTempTable3(sesid, prgcolumndef, ccolumn, pidxunicode, grbit, ptableid, prgcolumnid)
-- sesid : JET_SESID
-- prgcolumndef : JET_COLUMNDEF*
-- ccolumn : DWORD
-- pidxunicode : JET_UNICODEINDEX* optional
-- grbit : DWORD
-- ptableid : JET_TABLEID* out
-- prgcolumnid : DWORD* out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('ESENT.dll');
const JetOpenTempTable3 = lib.func('__stdcall', 'JetOpenTempTable3', 'int32_t', ['uintptr_t', 'void *', 'uint32_t', 'void *', 'uint32_t', 'uintptr_t *', 'uint32_t *']);
// JetOpenTempTable3(sesid, prgcolumndef, ccolumn, pidxunicode, grbit, ptableid, prgcolumnid)
// sesid : JET_SESID -> 'uintptr_t'
// prgcolumndef : JET_COLUMNDEF* -> 'void *'
// ccolumn : DWORD -> 'uint32_t'
// pidxunicode : JET_UNICODEINDEX* optional -> 'void *'
// grbit : DWORD -> 'uint32_t'
// ptableid : JET_TABLEID* out -> 'uintptr_t *'
// prgcolumnid : DWORD* out -> 'uint32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("ESENT.dll", {
  JetOpenTempTable3: { parameters: ["usize", "pointer", "u32", "pointer", "u32", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.JetOpenTempTable3(sesid, prgcolumndef, ccolumn, pidxunicode, grbit, ptableid, prgcolumnid)
// sesid : JET_SESID -> "usize"
// prgcolumndef : JET_COLUMNDEF* -> "pointer"
// ccolumn : DWORD -> "u32"
// pidxunicode : JET_UNICODEINDEX* optional -> "pointer"
// grbit : DWORD -> "u32"
// ptableid : JET_TABLEID* out -> "pointer"
// prgcolumnid : DWORD* out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t JetOpenTempTable3(
    size_t sesid,
    void* prgcolumndef,
    uint32_t ccolumn,
    void* pidxunicode,
    uint32_t grbit,
    size_t* ptableid,
    uint32_t* prgcolumnid);
C, "ESENT.dll");
// $ffi->JetOpenTempTable3(sesid, prgcolumndef, ccolumn, pidxunicode, grbit, ptableid, prgcolumnid);
// sesid : JET_SESID
// prgcolumndef : JET_COLUMNDEF*
// ccolumn : DWORD
// pidxunicode : JET_UNICODEINDEX* optional
// grbit : DWORD
// ptableid : JET_TABLEID* out
// prgcolumnid : DWORD* out
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Esent extends StdCallLibrary {
    Esent INSTANCE = Native.load("esent", Esent.class);
    int JetOpenTempTable3(
        long sesid,   // JET_SESID
        Pointer prgcolumndef,   // JET_COLUMNDEF*
        int ccolumn,   // DWORD
        Pointer pidxunicode,   // JET_UNICODEINDEX* optional
        int grbit,   // DWORD
        LongByReference ptableid,   // JET_TABLEID* out
        IntByReference prgcolumnid   // DWORD* out
    );
}
@[Link("esent")]
lib LibESENT
  fun JetOpenTempTable3 = JetOpenTempTable3(
    sesid : LibC::SizeT,   # JET_SESID
    prgcolumndef : JET_COLUMNDEF*,   # JET_COLUMNDEF*
    ccolumn : UInt32,   # DWORD
    pidxunicode : JET_UNICODEINDEX*,   # JET_UNICODEINDEX* optional
    grbit : UInt32,   # DWORD
    ptableid : LibC::SizeT*,   # JET_TABLEID* out
    prgcolumnid : UInt32*   # DWORD* out
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef JetOpenTempTable3Native = Int32 Function(UintPtr, Pointer<Void>, Uint32, Pointer<Void>, Uint32, Pointer<UintPtr>, Pointer<Uint32>);
typedef JetOpenTempTable3Dart = int Function(int, Pointer<Void>, int, Pointer<Void>, int, Pointer<UintPtr>, Pointer<Uint32>);
final JetOpenTempTable3 = DynamicLibrary.open('ESENT.dll')
    .lookupFunction<JetOpenTempTable3Native, JetOpenTempTable3Dart>('JetOpenTempTable3');
// sesid : JET_SESID -> UintPtr
// prgcolumndef : JET_COLUMNDEF* -> Pointer<Void>
// ccolumn : DWORD -> Uint32
// pidxunicode : JET_UNICODEINDEX* optional -> Pointer<Void>
// grbit : DWORD -> Uint32
// ptableid : JET_TABLEID* out -> Pointer<UintPtr>
// prgcolumnid : DWORD* out -> Pointer<Uint32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function JetOpenTempTable3(
  sesid: NativeUInt;   // JET_SESID
  prgcolumndef: Pointer;   // JET_COLUMNDEF*
  ccolumn: DWORD;   // DWORD
  pidxunicode: Pointer;   // JET_UNICODEINDEX* optional
  grbit: DWORD;   // DWORD
  ptableid: Pointer;   // JET_TABLEID* out
  prgcolumnid: Pointer   // DWORD* out
): Integer; stdcall;
  external 'ESENT.dll' name 'JetOpenTempTable3';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "JetOpenTempTable3"
  c_JetOpenTempTable3 :: CUIntPtr -> Ptr () -> Word32 -> Ptr () -> Word32 -> Ptr CUIntPtr -> Ptr Word32 -> IO Int32
-- sesid : JET_SESID -> CUIntPtr
-- prgcolumndef : JET_COLUMNDEF* -> Ptr ()
-- ccolumn : DWORD -> Word32
-- pidxunicode : JET_UNICODEINDEX* optional -> Ptr ()
-- grbit : DWORD -> Word32
-- ptableid : JET_TABLEID* out -> Ptr CUIntPtr
-- prgcolumnid : DWORD* out -> Ptr Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let jetopentemptable3 =
  foreign "JetOpenTempTable3"
    (size_t @-> (ptr void) @-> uint32_t @-> (ptr void) @-> uint32_t @-> (ptr size_t) @-> (ptr uint32_t) @-> returning int32_t)
(* sesid : JET_SESID -> size_t *)
(* prgcolumndef : JET_COLUMNDEF* -> (ptr void) *)
(* ccolumn : DWORD -> uint32_t *)
(* pidxunicode : JET_UNICODEINDEX* optional -> (ptr void) *)
(* grbit : DWORD -> uint32_t *)
(* ptableid : JET_TABLEID* out -> (ptr size_t) *)
(* prgcolumnid : DWORD* out -> (ptr uint32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library esent (t "ESENT.dll"))
(cffi:use-foreign-library esent)

(cffi:defcfun ("JetOpenTempTable3" jet-open-temp-table3 :convention :stdcall) :int32
  (sesid :uint64)   ; JET_SESID
  (prgcolumndef :pointer)   ; JET_COLUMNDEF*
  (ccolumn :uint32)   ; DWORD
  (pidxunicode :pointer)   ; JET_UNICODEINDEX* optional
  (grbit :uint32)   ; DWORD
  (ptableid :pointer)   ; JET_TABLEID* out
  (prgcolumnid :pointer))   ; DWORD* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $JetOpenTempTable3 = Win32::API::More->new('ESENT',
    'int JetOpenTempTable3(WPARAM sesid, LPVOID prgcolumndef, DWORD ccolumn, LPVOID pidxunicode, DWORD grbit, LPVOID ptableid, LPVOID prgcolumnid)');
# my $ret = $JetOpenTempTable3->Call($sesid, $prgcolumndef, $ccolumn, $pidxunicode, $grbit, $ptableid, $prgcolumnid);
# sesid : JET_SESID -> WPARAM
# prgcolumndef : JET_COLUMNDEF* -> LPVOID
# ccolumn : DWORD -> DWORD
# pidxunicode : JET_UNICODEINDEX* optional -> LPVOID
# grbit : DWORD -> DWORD
# ptableid : JET_TABLEID* out -> LPVOID
# prgcolumnid : DWORD* out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

類似 API
使用する型