Zum Hauptinhalt springen
Diese Funktion deinitialisiert ABBYY FineReader Engine. Sie muss zum Deinitialisieren des mit der Funktion InitializeEngine abgerufenen Engine-Objekts aufgerufen werden. Vor der Deinitialisierung müssen Sie alle Referenzen auf FineReader Engine-Objekte freigeben.

Syntax

C++

HRESULT __stdcall DeinitializeEngine();

C#

int DeinitializeEngine();

Visual Basic .NET

Private Declare Function DeinitializeEngine Lib "FREngine.dll" () As Integer

Rückgabewerte

Diese Funktion gibt E_FAIL zurück, wenn nicht alle Objekte freigegeben sind. In diesem Fall können Sie mit der Methode IEngine::StartLogging die Liste der nicht freigegebenen Objekte abrufen. Die Funktion kann die Standard-Rückgabewerte von ABBYY FineReader Engine-Funktionen zurückgeben.

Hinweise

Initialisieren und deinitialisieren Sie ABBYY FineReader Engine weder an den Einstiegspunkten anderer dynamischer Bibliotheken noch in Konstruktoren und Destruktoren statischer und globaler Objekte, die in dynamischen Bibliotheken implementiert sind, da diese an den Einstiegspunkten der dynamischen Bibliotheken aufgerufen werden.
ABBYY FineReader Engine sollte an anderer Stelle initialisiert und deinitialisiert werden, zum Beispiel in der Funktion main oder WinMain eines ausführbaren Moduls.
: Unter Windows ist diese Einschränkung darauf zurückzuführen, dass die Win32-Funktionen LoadLibrary und FreeLibrary nicht reentrant sind.

Beispiele

IEngine* FineReaderEngine = 0;
HMODULE EngineLibraryHandle = 0;
static HRESULT deinitializeEngine()
{
 // Engine-Objekt freigeben
 if( FineReaderEngine != 0 ) {
  FineReaderEngine->Release();
  FineReaderEngine = 0;
 }
 // DeinitializeEngine aufrufen
 typedef HRESULT (STDAPICALLTYPE* DeinitializeEngineFunc)();
 DeinitializeEngineFunc pDeinitializeEngine =
  (DeinitializeEngineFunc)GetProcAddress( EngineLibraryHandle, "DeinitializeEngine" );
 if( pDeinitializeEngine == 0 || FAILED( pDeinitializeEngine() ) ) {
  setLastErrorInfo( L"Can't unload FineReader Engine." );
  return E_UNEXPECTED;
 }
 return S_OK;
}
public class EngineLoader : IDisposable
{
    // FineReader Engine entladen
    public void Dispose()
    {
        if (engine == null)
        {
            // Engine wurde nicht geladen
            return;
        }
        engine = null;
        // Alle Objekte vor dem FreeLibrary-Aufruf löschen
        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;
        // Ausnahme nach der Bereinigung auslösen
        Marshal.ThrowExceptionForHR(hresult);
    }
    // Kernel32.dll-Funktionen
    [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-Funktionen
    [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 Variablen
    private FREngine.IEngine engine = null;
    // Handle zu FREngine.dll
    private IntPtr dllHandle = IntPtr.Zero;
    private InitializeEngine initializeEngine = null;
    private DeinitializeEngine deinitializeEngine = null;
    private DllCanUnloadNow dllCanUnloadNow = null;
}
Die Funktion wird in allen Codebeispielen außer dem Windows-Beispiel EnginesPool verwendet.

Siehe auch

InitializeEngine Different Ways to Load the Engine Object