ABBYY FRE 是一个 COM 对象。GetEngineObject()
除了它是一个单独的函数外,它的行为就像一个普通的 COM 接口方法。这意味着以下内容:它不允许异常传播到外部。为了实现这一点,它捕获所有异常,将它们转换为适当HRESULT
的值并可能设置IErrorInfo
.
您试图分析方法内部抛出的异常没有机会找到问题所在。那是因为在内部它可能像这样工作:
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()
为此,请使用同一示例项目中的函数代码。只是不要盯着抛出的异常 - 你没有机会,让它传播并被翻译。