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()
기능 코드를 사용하십시오. 던져지는 예외를 쳐다 보지 마세요. 당신은 그걸 가지고 아무런 기회도 갖지 않고, 전파되고 번역 될 수 있습니다.
어떤 버전의 ABBYY FRE입니까? LoadLibraryEx() 및 GetEngineObject가 성공합니까? 예외가 얼마나 정확하게 보이나요? – sharptooth
ABBYY Fine Reader Engine 9.0 Visual Studio에서 pGetEngineObject를 호출하는 동안 예외가 발생합니다. –
당신은 디버거가 ther가 Throw 된 예외라고 말하고 있습니까? 그렇다면 GetEngineObject()가 반환 한 후 check() 함수에서 찾은 코드를 사용하여 IErrorInfo * 및 설명 텍스트를 검색합니다. 그 텍스트는 잘못된 것을 설명 할 것입니다. – sharptooth