메인 콘텐츠로 건너뛰기
이 함수는 ABBYY FineReader Engine을 종료합니다. InitializeEngine 함수를 사용해 얻은 엔진 객체를 종료하려면 이 함수를 호출해야 합니다. 종료하기 전에 FineReader Engine 객체에 대한 모든 참조를 해제해야 합니다.

구문

C++

HRESULT __stdcall DeinitializeEngine();

C#

int DeinitializeEngine();

Visual Basic .NET

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

반환 값

모든 객체가 해제되지 않은 경우 이 함수는 E_FAIL을 반환합니다. 이 경우 IEngine::StartLogging 메서드를 사용해 해제되지 않은 객체 목록을 확인할 수 있습니다. 이 함수는 ABBYY FineReader Engine 함수의 표준 반환 값을 반환할 수도 있습니다.

참고 사항

동적 라이브러리의 진입점에서는 물론, 동적 라이브러리에 구현된 정적 객체 및 전역 객체의 생성자와 소멸자에서도 ABBYY FineReader Engine을 초기화하거나 초기화 해제하지 마십시오. 이들은 동적 라이브러리의 진입점에서 호출되기 때문입니다.
사용자는 ABBYY FineReader Engine의 초기화 및 초기화 해제를 다른 위치에서 수행해야 합니다. 예를 들어 실행 파일 모듈의 main 또는 WinMain 함수에서 수행할 수 있습니다.
: Windows에서는 Win32 LoadLibrary 및 FreeLibrary 함수가 재진입 가능하지 않기 때문에 이러한 제한이 있습니다.

샘플

IEngine* FineReaderEngine = 0;
HMODULE EngineLibraryHandle = 0;
static HRESULT deinitializeEngine()
{
 // Engine 객체 해제
 if( FineReaderEngine != 0 ) {
  FineReaderEngine->Release();
  FineReaderEngine = 0;
 }
 // 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
{
    // FineReader Engine 언로드
    public void Dispose()
    {
        if (engine == null)
        {
            // Engine이 로드되지 않음
            return;
        }
        engine = null;
        // 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;
        // 정리 후 예외 발생
        Marshal.ThrowExceptionForHR(hresult);
    }
    // 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);
    // 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();
    // 비공개 변수
    private FREngine.IEngine engine = null;
    // FREngine.dll 핸들
    private IntPtr dllHandle = IntPtr.Zero;
    private InitializeEngine initializeEngine = null;
    private DeinitializeEngine deinitializeEngine = null;
    private DllCanUnloadNow dllCanUnloadNow = null;
}
이 함수는 Windows EnginesPool 샘플을 제외한 모든 코드 샘플에서 사용됩니다.

참고 항목

InitializeEngine 엔진 객체를 로드하는 여러 방법