Pular para o conteúdo principal
Esta função desinicializa o ABBYY FineReader Engine. Ela deve ser chamada para desinicializar o objeto Engine obtido com a função InitializeEngine. Antes de desinicializar, você deve liberar todas as referências a objetos do FineReader Engine.

Sintaxe

C++

HRESULT __stdcall DeinitializeEngine();

C#

int DeinitializeEngine();

Visual Basic .NET

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

Valores de retorno

Esta função retorna E_FAIL se nem todos os objetos tiverem sido liberados. Nesse caso, você pode obter a lista dos objetos não liberados usando o método IEngine::StartLogging. A função pode retornar os valores de retorno padrão das funções do ABBYY FineReader Engine.

Observações

Não inicialize nem desinicialize ABBYY FineReader Engine nos pontos de entrada de outras bibliotecas dinâmicas nem em construtores e destrutores de objetos estáticos e globais implementados em bibliotecas dinâmicas, pois eles são chamados nos pontos de entrada da biblioteca dinâmica.
O usuário deve inicializar e desinicializar ABBYY FineReader Engine em outro ponto. Por exemplo, na função main ou WinMain de um módulo executável.
: No Windows, essa restrição se deve ao fato de que as funções Win32 LoadLibrary e FreeLibrary não são reentrantes.

Exemplos

IEngine* FineReaderEngine = 0;
HMODULE EngineLibraryHandle = 0;
static HRESULT deinitializeEngine()
{
 // Libera o objeto Engine
 if( FineReaderEngine != 0 ) {
  FineReaderEngine->Release();
  FineReaderEngine = 0;
 }
 // Chama 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
{
    // Descarrega o FineReader Engine
    public void Dispose()
    {
        if (engine == null)
        {
            // O Engine não foi carregado
            return;
        }
        engine = null;
        // Exclui todos os objetos antes da chamada 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;
        // lança a exceção após a limpeza
        Marshal.ThrowExceptionForHR(hresult);
    }
    // Funções 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);
    // Funções 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();
    // Variáveis privadas
    private FREngine.IEngine engine = null;
    // Handle para FREngine.dll
    private IntPtr dllHandle = IntPtr.Zero;
    private InitializeEngine initializeEngine = null;
    private DeinitializeEngine deinitializeEngine = null;
    private DllCanUnloadNow dllCanUnloadNow = null;
}
A função é usada em todos os exemplos de código, exceto no exemplo EnginesPool para Windows.

Veja também

InitializeEngine Diferentes formas de carregar o objeto Engine