Documentation Index
Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
Use this file to discover all available pages before exploring further.
この関数は、ABBYY FineReader Engine の終了処理を行います。この関数は、InitializeEngine 関数を使用して取得した Engine オブジェクトの終了処理を行うために呼び出す必要があります。終了処理を行う前に、FineReader Engineオブジェクトへのすべての参照を解放しておく必要があります。
HRESULT __stdcall DeinitializeEngine();
int DeinitializeEngine();
Private Declare Function DeinitializeEngine Lib "FREngine.dll" () As Integer
すべてのオブジェクトが解放されていない場合、この関数は E_FAIL を返します。その場合は、IEngine::StartLogging メソッドを使用して、解放されていないオブジェクトの一覧を取得できます。この関数は、ABBYY FineReader Engine 関数の標準的な戻り値を返すこともあります。
ABBYY FineReader Engine の初期化および終了処理を、他の動的ライブラリのエントリポイントで行わないでください。また、動的ライブラリ内で実装された静的オブジェクトおよびグローバルオブジェクトのコンストラクターやデストラクター内でも行わないでください。これらは動的ライブラリのエントリポイントで呼び出されるためです。
ABBYY FineReader Engine の初期化および終了処理は、それ以外の場所で行ってください。たとえば、実行可能モジュールの main 関数または WinMain 関数で行います。
Windows では、この制限は Win32 の LoadLibrary 関数と FreeLibrary 関数がリエントラントではないことに起因します。
IEngine* FineReaderEngine = 0;
HMODULE EngineLibraryHandle = 0;
static HRESULT deinitializeEngine()
{
// Engine オブジェクト を解放する
if( FineReaderEngine != 0 ) {
FineReaderEngine->Release();
FineReaderEngine = 0;
}
// DeinitializeEngine を呼び出す
typedef HRESULT (STDAPICALLTYPE* DeinitializeEngineFunc)();
DeinitializeEngineFunc pDeinitializeEngine =
(DeinitializeEngineFunc)GetProcAddress( EngineLibraryHandle, "DeinitializeEngine" );
if( pDeinitializeEngine == 0 || FAILED( pDeinitializeEngine() ) ) {
setLastErrorInfo( L"FineReader Engine をアンロードできません。" );
return E_UNEXPECTED;
}
return S_OK;
}
public class EngineLoader : IDisposable
{
// FineReader Engine をアンロードする
public void Dispose()
{
if (engine == null)
{
// Engine はロードされていない
return;
}
engine = null;
// FreeLibrary を呼び出す前にすべての object を削除する
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
int hresult = deinitializeEngine();
hresult = dllCanUnloadNow();
if (hresult == 0)
{
FreeLibrary(dllHandle);
}
dllHandle = IntPtr.Zero;
initializeEngine = null;
deinitializeEngine = null;
dllCanUnloadNow = null;
// クリーンアップ後に例外をスローする
Marshal.ThrowExceptionForHR(hresult);
}
// Kernel32.dll の関数
[DllImport("kernel32.dll")]
private static extern IntPtr LoadLibraryEx(string dllToLoad, IntPtr reserved, uint flags);
private const uint LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008;
[DllImport("kernel32.dll")]
private static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32.dll")]
private static extern bool FreeLibrary(IntPtr hModule);
// FREngine.dll の関数
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private delegate int InitializeEngine( string customerProjectId, string LicensePath, string LicensePassword, , , , ref FREngine.IEngine engine);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate int DeinitializeEngine();
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate int DllCanUnloadNow();
// private 変数
private FREngine.IEngine engine = null;
// FREngine.dll へのハンドル
private IntPtr dllHandle = IntPtr.Zero;
private InitializeEngine initializeEngine = null;
private DeinitializeEngine deinitializeEngine = null;
private DllCanUnloadNow dllCanUnloadNow = null;
}
この関数は、Windows EnginesPool サンプルを除くすべてのコード サンプルで使用されます。
InitializeEngine
Engine オブジェクトをロードするさまざまな方法