Pregunta
Tengo este código en el proyecto 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 )
La última línea arroja esta excepción:
El servidor RPC no está disponible
¿Qué puede causar esta excepción?
Solución
ABBYY FRE es un objeto COM. GetEngineObject()
Se comporta como un método de interfaz COM normal excepto que es una función separada.Lo que significa lo siguiente:no permite que las excepciones se propaguen al exterior.Para lograr esto, captura todas las excepciones, las traduce en términos apropiados. HRESULT
valores y posiblemente establece IErrorInfo
.
Si intenta analizar la excepción lanzada dentro de un método, no tiene posibilidades de encontrar cuál es el problema.Esto se debe a que internamente podría funcionar así:
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() );
}
}
para que la llamada real pueda detectar excepciones y traducirlas para proporcionar diagnósticos significativos.Para obtener el diagnóstico es necesario recuperar IErrorInfo*
después de que la función regrese.Usa el código de check()
función del mismo proyecto de ejemplo para eso.Simplemente no mires fijamente la excepción que se lanza; no tienes ninguna posibilidad con eso, deja que se propague y se traduzca.