メインコンテンツへスキップ
この関数は、ABBYY FineReader Engine の終了処理を行います。この関数は、InitializeEngine 関数を使用して取得した Engine オブジェクトの終了処理を行うために呼び出す必要があります。終了処理を行う前に、FineReader Engineオブジェクトへのすべての参照を解放しておく必要があります。

構文

C++

HRESULT __stdcall DeinitializeEngine();

C#

int DeinitializeEngine();

Visual Basic .NET

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 オブジェクトをロードするさまざまな方法