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.
HRESULT __stdcall DeinitializeEngine ();
int DeinitializeEngine();
Private Declare Function DeinitializeEngine Lib "FREngine.dll" () As Integer
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 .
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.
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 .
InitializeEngine
Diferentes formas de cargar el objeto Engine