Frage

Ich habe diesen Code im C ++ / CLI-Projekt:

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 )

die letzte Zeile löst diese Ausnahme aus:

RPC-Server ist nicht verfügbar

Was kann diese Ausnahme verursachen?

War es hilfreich?

Lösung

ABBYY FRE ist ein COM-Objekt. GetEngineObject() verhält sich wie eine normale COM-Schnittstellenmethode, außer dass es sich um eine separate Funktion handelt.Was Folgendes bedeutet:es erlaubt keine Ausnahmen, die sich nach außen ausbreiten.Um dies zu erreichen, fängt es alle Ausnahmen ab, übersetzt sie in geeignete HRESULT werte und möglicherweise Einstellungen IErrorInfo.

Wenn Sie versuchen, die in einer Methode ausgelöste Ausnahme zu analysieren, haben Sie keine Chance, das Problem zu finden.Das liegt daran, dass es intern so funktionieren könnte:

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() );
    }
}

so kann der eigentliche Aufruf Ausnahmen abfangen und übersetzen, um aussagekräftige Diagnosen bereitzustellen.Um diese Diagnose zu erhalten, müssen Sie Folgendes abrufen IErrorInfo* nachdem die Funktion erneut gestartet wurde.Code verwenden von check() funktion aus dem gleichen Beispielprojekt dafür.Starren Sie einfach nicht auf die ausgelöste Ausnahme - Sie haben damit keine Chance, lassen Sie sie sich verbreiten und übersetzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top