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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top