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()
из того же примера проекта. Только не смотрите на создаваемое исключение - у вас нет шансов на это, пусть оно распространяется и переводится.