2010-07-08 4 views
1

나는이 C++/CLI 프로젝트에서이 코드이 원인이 있습니다 무엇 로드 ABBYY 엔진

사용할 수 없습니다에서

RPC 서버 : 마지막 줄이 예외를 throw

CSafePtr<IEngine> engine; 
HMODULE libraryHandle; 

libraryHandle = LoadLibraryEx("FREngine.dll", 0, LOAD_WITH_ALTERED_SEARCH_PATH); 

typedef HRESULT (STDAPICALLTYPE* GetEngineObjectFunc)(BSTR, BSTR, BSTR, IEngine**); 
GetEngineObjectFunc pGetEngineObject = (GetEngineObjectFunc)GetProcAddress(libraryHandle, "GetEngineObject"); 

pGetEngineObject(freDeveloperSN, 0, 0, &engine) 

예외?

+0

어떤 버전의 ABBYY FRE입니까? LoadLibraryEx() 및 GetEngineObject가 성공합니까? 예외가 얼마나 정확하게 보이나요? – sharptooth

+0

ABBYY Fine Reader Engine 9.0 Visual Studio에서 pGetEngineObject를 호출하는 동안 예외가 발생합니다. –

+1

당신은 디버거가 ther가 Throw 된 예외라고 말하고 있습니까? 그렇다면 GetEngineObject()가 반환 한 후 check() 함수에서 찾은 코드를 사용하여 IErrorInfo * 및 설명 텍스트를 검색합니다. 그 텍스트는 잘못된 것을 설명 할 것입니다. – sharptooth

답변

2

ABBYY FRE는 COM 개체입니다. GetEngineObject()은 별도의 기능을 제외하고는 일반적인 COM 인터페이스 방식과 유사하게 작동합니다. 즉, 예외가 외부로 전파되는 것을 허용하지 않습니다. 이를 달성하기 위해 모든 예외를 catch하고 적절한 HRESULT 값으로 변환하고 IErrorInfo을 설정할 수 있습니다.

메서드 내에서 throw 된 예외를 분석하려고하면 문제의 원인을 찾을 기회가 없습니다.

HRESULT GetEngineObject(params) 
{ 
    try { 
     //that's for illustartion, code could be more comlex 
     initializeProtection(params); 
     obtainEngineObject(params); 
    } catch(std::exception& e) { 
     setErrorInfo(e); //this will set up IErrorInfo 
     return translateException(e); // this will produce a relevant HRESULT 
    } 
    return S_OK; 
} 

void intializeProtection() 
{ 
    try { 
     doInitializeProtection();//maybe deep inside that exception is thrown 
     ///blahblahblah 
    } catch(std::exception& e) { 
     //here it will be translated to a more meaningful one 
     throw someOtherException("Can't initialize protection: " + e.what()); 
    } 
} 

그래서 실제 호출이 예외를 잡을 수있는 의미있는 진단을 제공하도록 번역 : 내부적으로는 다음과 같이 작동 할 수 있기 때문입니다. 진단을 받으려면 함수가 다시 실행 된 후 IErrorInfo*을 검색해야합니다. 그것을위한 동일한 예제 프로젝트의 check() 기능 코드를 사용하십시오. 던져지는 예외를 쳐다 보지 마세요. 당신은 그걸 가지고 아무런 기회도 갖지 않고, 전파되고 번역 될 수 있습니다.