Вопрос
У меня есть этот код в проекте C ++ / CLI:
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 )
.
Последняя строка бросает это исключение:
RPC Server в недоступном
Что может вызвать это исключение?
Решение
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() );
}
}
.
Так что фактический вызов может ловить исключения и перевести их для обеспечения значимой диагностики.Чтобы получить диагностику, вам нужно получить генеракодицетагкод после функции RETUNS.Используйте код из IErrorInfo*
функции из того же примерного проекта для этого.Просто не смотрите за брошенное исключение - у вас нет шансов с этим, позвольте ему распространяться и быть переведенным.