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

JetInit3W

関数
復元情報を指定してESEインスタンスを初期化する。
DLLESENT.dll文字セットUnicode (-W)呼出規約winapi

シグネチャ

// ESENT.dll  (Unicode / -W)
#include <windows.h>

INT JetInit3W(
    JET_INSTANCE* pinstance,   // optional
    JET_RSTINFO_W* prstInfo,   // optional
    DWORD grbit
);

パラメーター

名前型方向説明
pinstanceJET_INSTANCE*inoutoptional初期化するインスタンスハンドルへのポインタ。NULLまたはNilで既定インスタンスを生成する。
prstInfoJET_RSTINFO_W*inoptionalリカバリ進捗状況や追加データベース指定を行うJET_RSTINFO_W構造体へのポインタ。NULL可。
grbitDWORDin初期化動作を制御するJET_bitInitオプションのビットフラグ。

戻り値の型: INT

公式ドキュメント

JetInit3 関数は、データベースエンジンを、アプリケーションがデータベースファイルを使用できる状態にします。エンジンは初期化に向けてあらかじめ適切に構成されている必要があり、その構成は JetSetSystemParameter 関数を使用して行います。なお、データベースのクラッシュ回復は初期化処理の一部として自動的に実行されます。

戻り値

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

解説

インスタンスは、JetSetSystemParameter 関数以外から使用する前に、JetInit3 関数の呼び出しによって初期化する必要があります。

インスタンスは JetTerm 関数の呼び出しによって破棄されます。これは、そのインスタンスが JetInit 関数によって初期化されていない場合でも同様です。インスタンスは、データベースエンジンにおける回復可能性の単位です。インスタンスは、一連のデータベースファイル内のデータの整合性を保護するために使用されるすべてのファイルのライフサイクルを制御します。これらのファイルには、チェックポイントファイルとトランザクションログファイルが含まれます。なお、JetInit3 関数が失敗した場合は JetTerm を呼び出さないでください。ただし、JetInit3 が一度も呼び出されなかった場合や JetInit3 が成功した場合は、JetCreateInstance2 によって作成されたすべてのインスタンスに対して JetTerm を呼び出す必要があります。

関連するデータベースがすべて存在しないログのセットに対して回復が実行されており(通常の状況ではエラー JET_errAttachedDatabaseMismatch が返されます)、データベースが欠落していても回復を続行したい場合は、JET_bitReplayIgnoreMissingDB を使用して、利用可能なデータベースについて回復を続行します。

クラッシュ回復は必ずしもクラッシュ時と同じコンピューター上で(かつ同じ構成で)実行されるとは限りませんが、データベースの場所は通常変わりません。ただし、ファイルを別のコンピューターに移動する場合や、スナップショットバックアップを別の場所に復元する場合など、一部のシナリオではこれが当てはまりません。JetInit3 関数では、(JET_RSTINFO 構造体および JET_RSTMAP 構造体を使用して)以前のデータベースの場所と新しい場所との間のマッピングを指定できます。実際には、データベースファイルが新しい場所に存在していれば、必要なのは新しい場所だけです。復元されたデータベースの場所が判明すれば、復元処理を通じてデータベースを識別するためにデータベースシグネチャが使用されます。元のデータベースの場所が必要になるのは、データベースを再作成する必要がある場合だけであり、その場合はシグネチャが判明しています。

さらに、Undo 操作の後に回復を停止する必要がある場合は、回復を停止する特定のログ位置を指定できます。なお、これには、指定した位置がそのログ世代に含まれるものの実際のログの末尾を超えている場合に、特定のログ世代の末尾で停止する機能も含まれます。

詳細については、JetInit のトピックの「解説」セクションを参照してください。

要件

要件 値

クライアント

Windows Vista が必要です。

サーバー

Windows Server 2008 が必要です。

ヘッダー

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

ライブラリ

ESENT.lib を使用します。

DLL

ESENT.dll が必要です。

Unicode

JetInit3W (Unicode) および JetInit3A (ANSI) として実装されています。

関連項目

Extensible Storage Engine Files
JET_ERR
JET_GRBIT
JET_INSTANCE
JET_RSTINFO
JET_RSTMAP
JetCreateInstance
JetInit
JetInit2
JetSetSystemParameter
Resource Parameters

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

各言語での呼び出し定義

// ESENT.dll  (Unicode / -W)
#include <windows.h>

INT JetInit3W(
    JET_INSTANCE* pinstance,   // optional
    JET_RSTINFO_W* prstInfo,   // optional
    DWORD grbit
);
[DllImport("ESENT.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern int JetInit3W(
    IntPtr pinstance,   // JET_INSTANCE* optional, in/out
    IntPtr prstInfo,   // JET_RSTINFO_W* optional
    uint grbit   // DWORD
);
<DllImport("ESENT.dll", CharSet:=CharSet.Unicode, ExactSpelling:=True)>
Public Shared Function JetInit3W(
    pinstance As IntPtr,   ' JET_INSTANCE* optional, in/out
    prstInfo As IntPtr,   ' JET_RSTINFO_W* optional
    grbit As UInteger   ' DWORD
) As Integer
End Function
' pinstance : JET_INSTANCE* optional, in/out
' prstInfo : JET_RSTINFO_W* optional
' grbit : DWORD
Declare PtrSafe Function JetInit3W Lib "esent" ( _
    ByVal pinstance As LongPtr, _
    ByVal prstInfo As LongPtr, _
    ByVal grbit As Long) As Long
' Unicode(W): 文字列は ByVal As LongPtr とし StrPtr(unicodeStr) を渡す
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

JetInit3W = ctypes.windll.esent.JetInit3W
JetInit3W.restype = ctypes.c_int
JetInit3W.argtypes = [
    ctypes.c_void_p,  # pinstance : JET_INSTANCE* optional, in/out
    ctypes.c_void_p,  # prstInfo : JET_RSTINFO_W* optional
    wintypes.DWORD,  # grbit : DWORD
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('ESENT.dll')
JetInit3W = Fiddle::Function.new(
  lib['JetInit3W'],
  [
    Fiddle::TYPE_VOIDP,  # pinstance : JET_INSTANCE* optional, in/out
    Fiddle::TYPE_VOIDP,  # prstInfo : JET_RSTINFO_W* optional
    -Fiddle::TYPE_INT,  # grbit : DWORD
  ],
  Fiddle::TYPE_INT)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"
#[link(name = "esent")]
extern "system" {
    fn JetInit3W(
        pinstance: *mut usize,  // JET_INSTANCE* optional, in/out
        prstInfo: *mut JET_RSTINFO_W,  // JET_RSTINFO_W* optional
        grbit: u32  // DWORD
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("ESENT.dll", CharSet = CharSet.Unicode)]
public static extern int JetInit3W(IntPtr pinstance, IntPtr prstInfo, uint grbit);
"@
$api = Add-Type -MemberDefinition $sig -Name 'ESENT_JetInit3W' -Namespace Win32 -PassThru
# $api::JetInit3W(pinstance, prstInfo, grbit)
#uselib "ESENT.dll"
#func global JetInit3W "JetInit3W" wptr, wptr, wptr
; JetInit3W varptr(pinstance), varptr(prstInfo), grbit   ; 戻り値は stat
; pinstance : JET_INSTANCE* optional, in/out -> "wptr"
; prstInfo : JET_RSTINFO_W* optional -> "wptr"
; grbit : DWORD -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "ESENT.dll"
#cfunc global JetInit3W "JetInit3W" var, var, int
; res = JetInit3W(pinstance, prstInfo, grbit)
; pinstance : JET_INSTANCE* optional, in/out -> "var"
; prstInfo : JET_RSTINFO_W* optional -> "var"
; grbit : DWORD -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; INT JetInit3W(JET_INSTANCE* pinstance, JET_RSTINFO_W* prstInfo, DWORD grbit)
#uselib "ESENT.dll"
#cfunc global JetInit3W "JetInit3W" var, var, int
; res = JetInit3W(pinstance, prstInfo, grbit)
; pinstance : JET_INSTANCE* optional, in/out -> "var"
; prstInfo : JET_RSTINFO_W* optional -> "var"
; grbit : DWORD -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	esent = windows.NewLazySystemDLL("ESENT.dll")
	procJetInit3W = esent.NewProc("JetInit3W")
)

// pinstance (JET_INSTANCE* optional, in/out), prstInfo (JET_RSTINFO_W* optional), grbit (DWORD)
r1, _, err := procJetInit3W.Call(
	uintptr(pinstance),
	uintptr(prstInfo),
	uintptr(grbit),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // INT
function JetInit3W(
  pinstance: Pointer;   // JET_INSTANCE* optional, in/out
  prstInfo: Pointer;   // JET_RSTINFO_W* optional
  grbit: DWORD   // DWORD
): Integer; stdcall;
  external 'ESENT.dll' name 'JetInit3W';
result := DllCall("ESENT\JetInit3W"
    , "Ptr", pinstance   ; JET_INSTANCE* optional, in/out
    , "Ptr", prstInfo   ; JET_RSTINFO_W* optional
    , "UInt", grbit   ; DWORD
    , "Int")   ; return: INT
●JetInit3W(pinstance, prstInfo, grbit) = DLL("ESENT.dll", "int JetInit3W(void*, void*, dword)")
# 呼び出し: JetInit3W(pinstance, prstInfo, grbit)
# pinstance : JET_INSTANCE* optional, in/out -> "void*"
# prstInfo : JET_RSTINFO_W* optional -> "void*"
# grbit : DWORD -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。
const std = @import("std");

extern "esent" fn JetInit3W(
    pinstance: [*c]usize, // JET_INSTANCE* optional, in/out
    prstInfo: [*c]JET_RSTINFO_W, // JET_RSTINFO_W* optional
    grbit: u32 // DWORD
) callconv(std.os.windows.WINAPI) i32;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。
proc JetInit3W(
    pinstance: ptr uint,  # JET_INSTANCE* optional, in/out
    prstInfo: ptr JET_RSTINFO_W,  # JET_RSTINFO_W* optional
    grbit: uint32  # DWORD
): int32 {.importc: "JetInit3W", stdcall, dynlib: "ESENT.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。
pragma(lib, "esent");
extern(Windows)
int JetInit3W(
    size_t* pinstance,   // JET_INSTANCE* optional, in/out
    JET_RSTINFO_W* prstInfo,   // JET_RSTINFO_W* optional
    uint grbit   // DWORD
);
ccall((:JetInit3W, "ESENT.dll"), stdcall, Int32,
      (Ptr{Csize_t}, Ptr{JET_RSTINFO_W}, UInt32),
      pinstance, prstInfo, grbit)
# pinstance : JET_INSTANCE* optional, in/out -> Ptr{Csize_t}
# prstInfo : JET_RSTINFO_W* optional -> Ptr{JET_RSTINFO_W}
# grbit : DWORD -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。
local ffi = require("ffi")
ffi.cdef[[
int32_t JetInit3W(
    uintptr_t* pinstance,
    void* prstInfo,
    uint32_t grbit);
]]
local esent = ffi.load("esent")
-- esent.JetInit3W(pinstance, prstInfo, grbit)
-- pinstance : JET_INSTANCE* optional, in/out
-- prstInfo : JET_RSTINFO_W* optional
-- grbit : DWORD
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
-- Unicode(-W): uint16_t* には UTF-16LE のバッファ(ffi.new("uint16_t[?]", ...))を渡す。
const koffi = require('koffi');
const lib = koffi.load('ESENT.dll');
const JetInit3W = lib.func('__stdcall', 'JetInit3W', 'int32_t', ['uintptr_t *', 'void *', 'uint32_t']);
// JetInit3W(pinstance, prstInfo, grbit)
// pinstance : JET_INSTANCE* optional, in/out -> 'uintptr_t *'
// prstInfo : JET_RSTINFO_W* optional -> 'void *'
// grbit : DWORD -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("ESENT.dll", {
  JetInit3W: { parameters: ["pointer", "pointer", "u32"], result: "i32" },
});
// lib.symbols.JetInit3W(pinstance, prstInfo, grbit)
// pinstance : JET_INSTANCE* optional, in/out -> "pointer"
// prstInfo : JET_RSTINFO_W* optional -> "pointer"
// grbit : DWORD -> "u32"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t JetInit3W(
    size_t* pinstance,
    void* prstInfo,
    uint32_t grbit);
C, "ESENT.dll");
// $ffi->JetInit3W(pinstance, prstInfo, grbit);
// pinstance : JET_INSTANCE* optional, in/out
// prstInfo : JET_RSTINFO_W* optional
// grbit : DWORD
// 構造体/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, W32APIOptions.UNICODE_OPTIONS);
    int JetInit3W(
        LongByReference pinstance,   // JET_INSTANCE* optional, in/out
        Pointer prstInfo,   // JET_RSTINFO_W* optional
        int grbit   // DWORD
    );
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。
@[Link("esent")]
lib LibESENT
  fun JetInit3W = JetInit3W(
    pinstance : LibC::SizeT*,   # JET_INSTANCE* optional, in/out
    prstInfo : JET_RSTINFO_W*,   # JET_RSTINFO_W* optional
    grbit : UInt32   # DWORD
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef JetInit3WNative = Int32 Function(Pointer<UintPtr>, Pointer<Void>, Uint32);
typedef JetInit3WDart = int Function(Pointer<UintPtr>, Pointer<Void>, int);
final JetInit3W = DynamicLibrary.open('ESENT.dll')
    .lookupFunction<JetInit3WNative, JetInit3WDart>('JetInit3W');
// pinstance : JET_INSTANCE* optional, in/out -> Pointer<UintPtr>
// prstInfo : JET_RSTINFO_W* optional -> Pointer<Void>
// grbit : DWORD -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function JetInit3W(
  pinstance: Pointer;   // JET_INSTANCE* optional, in/out
  prstInfo: Pointer;   // JET_RSTINFO_W* optional
  grbit: DWORD   // DWORD
): Integer; stdcall;
  external 'ESENT.dll' name 'JetInit3W';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "JetInit3W"
  c_JetInit3W :: Ptr CUIntPtr -> Ptr () -> Word32 -> IO Int32
-- pinstance : JET_INSTANCE* optional, in/out -> Ptr CUIntPtr
-- prstInfo : JET_RSTINFO_W* optional -> Ptr ()
-- grbit : DWORD -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let jetinit3w =
  foreign "JetInit3W"
    ((ptr size_t) @-> (ptr void) @-> uint32_t @-> returning int32_t)
(* pinstance : JET_INSTANCE* optional, in/out -> (ptr size_t) *)
(* prstInfo : JET_RSTINFO_W* optional -> (ptr void) *)
(* grbit : DWORD -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library esent (t "ESENT.dll"))
(cffi:use-foreign-library esent)

(cffi:defcfun ("JetInit3W" jet-init3-w :convention :stdcall) :int32
  (pinstance :pointer)   ; JET_INSTANCE* optional, in/out
  (prst-info :pointer)   ; JET_RSTINFO_W* optional
  (grbit :uint32))   ; DWORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $JetInit3W = Win32::API::More->new('ESENT',
    'int JetInit3W(LPVOID pinstance, LPVOID prstInfo, DWORD grbit)');
# my $ret = $JetInit3W->Call($pinstance, $prstInfo, $grbit);
# pinstance : JET_INSTANCE* optional, in/out -> LPVOID
# prstInfo : JET_RSTINFO_W* optional -> LPVOID
# grbit : DWORD -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。

関連項目

文字セット違い
類似 API
使用する型