Saltar al contenido principal
Esta función desinicializa ABBYY FineReader Engine. Se debe llamar a esta función para desinicializar el objeto Engine obtenido mediante la función InitializeEngine. Antes de la desinicialización, debe liberar todas las referencias a los objetos de ABBYY FineReader Engine.

Sintaxis

C++

HRESULT __stdcall DeinitializeEngine();

C#

int DeinitializeEngine();

Visual Basic .NET

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

Valores de retorno

Esta función devuelve E_FAIL si no se han liberado todos los objetos. En ese caso, puede obtener la lista de los objetos no liberados mediante el método IEngine::StartLogging. La función puede devolver los valores de retorno estándar de las funciones de ABBYY FineReader Engine.

Observaciones

No inicialice ni desinicialice ABBYY FineReader Engine en los puntos de entrada de otras bibliotecas dinámicas, ni tampoco en los constructores y destructores de objetos estáticos y globales implementados en bibliotecas dinámicas, ya que se ejecutan en los puntos de entrada de estas bibliotecas.
El usuario debe inicializar y desinicializar ABBYY FineReader Engine en otro punto. Por ejemplo, en la función main o WinMain de un módulo ejecutable.
: En Windows, esta restricción se debe a que las funciones LoadLibrary y FreeLibrary de Win32 no son reentrantes.

Ejemplos

IEngine* FineReaderEngine = 0;
HMODULE EngineLibraryHandle = 0;
static HRESULT deinitializeEngine()
{
 // Liberar el objeto Engine
 if( FineReaderEngine != 0 ) {
  FineReaderEngine->Release();
  FineReaderEngine = 0;
 }
 // Llamar a DeinitializeEngine
 typedef HRESULT (STDAPICALLTYPE* DeinitializeEngineFunc)();
 DeinitializeEngineFunc pDeinitializeEngine =
  (DeinitializeEngineFunc)GetProcAddress( EngineLibraryHandle, "DeinitializeEngine" );
 if( pDeinitializeEngine == 0 || FAILED( pDeinitializeEngine() ) ) {
  setLastErrorInfo( L"No se puede descargar FineReader Engine." );
  return E_UNEXPECTED;
 }
 return S_OK;
}
public class EngineLoader : IDisposable
{
    // Descargar FineReader Engine
    public void Dispose()
    {
        if (engine == null)
        {
            // Engine no se cargó
            return;
        }
        engine = null;
        // Eliminar todos los objetos antes de llamar 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;
        // Generar una excepción después de la limpieza
        Marshal.ThrowExceptionForHR(hresult);
    }
    // Funciones de 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);
    // Funciones de 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();
    // Variables privadas
    private FREngine.IEngine engine = null;
    // Identificador de FREngine.dll
    private IntPtr dllHandle = IntPtr.Zero;
    private InitializeEngine initializeEngine = null;
    private DeinitializeEngine deinitializeEngine = null;
    private DllCanUnloadNow dllCanUnloadNow = null;
}
La función se usa en todos los ejemplos de código excepto en el ejemplo de Windows EnginesPool.

Consulte también

InitializeEngine Diferentes formas de cargar el objeto Engine