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?
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.