Vai al contenuto principale
Questa funzione deinizializza ABBYY FineReader Engine. La funzione deve essere chiamata per deinizializzare l’oggetto Engine ottenuto tramite la funzione InitializeEngine. Prima della deinizializzazione, è necessario rilasciare tutti i riferimenti agli oggetti di FineReader Engine.

Sintassi

C++

HRESULT __stdcall DeinitializeEngine();

C#

int DeinitializeEngine();

Visual Basic .NET

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

Valori di ritorno

Questa funzione restituisce E_FAIL se non sono stati rilasciati tutti gli oggetti. In tal caso, è possibile ottenere l’elenco degli oggetti non rilasciati tramite il metodo IEngine::StartLogging. La funzione può restituire i valori di ritorno standard delle funzioni di ABBYY FineReader Engine.

Osservazioni

Non inizializzare né deinizializzare ABBYY FineReader Engine nei punti di ingresso di altre librerie dinamiche, né nei costruttori e distruttori di oggetti statici e globali definiti nelle librerie dinamiche, poiché vengono chiamati nei punti di ingresso delle librerie dinamiche.
L’utente dovrebbe inizializzare e deinizializzare ABBYY FineReader Engine altrove. Ad esempio, nella funzione main o WinMain di un modulo eseguibile.
: In Windows, questa restrizione è dovuta al fatto che le funzioni Win32 LoadLibrary e FreeLibrary non sono rientranti.

Esempi

IEngine* FineReaderEngine = 0;
HMODULE EngineLibraryHandle = 0;
static HRESULT deinitializeEngine()
{
 // Rilascia l'oggetto Engine
 if( FineReaderEngine != 0 ) {
  FineReaderEngine->Release();
  FineReaderEngine = 0;
 }
 // Chiamata a DeinitializeEngine
 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
{
    // Scarica FineReader Engine
    public void Dispose()
    {
        if (engine == null)
        {
            // Engine non caricato
            return;
        }
        engine = null;
        // Eliminazione di tutti gli oggetti prima della chiamata a FreeLibrary
        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;
        // generazione dell'eccezione dopo la pulizia
        Marshal.ThrowExceptionForHR(hresult);
    }
    // Funzioni di 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);
    // Funzioni di 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();
    // variabili private
    private FREngine.IEngine engine = null;
    // Handle per FREngine.dll
    private IntPtr dllHandle = IntPtr.Zero;
    private InitializeEngine initializeEngine = null;
    private DeinitializeEngine deinitializeEngine = null;
    private DllCanUnloadNow dllCanUnloadNow = null;
}
La funzione è utilizzata in tutti gli esempi di codice tranne nell’esempio Windows EnginesPool.

Vedi anche

InitializeEngine Diversi modi per caricare l’oggetto Engine