Question
J'ai ce code en C++/CLI projet:
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 )
dernière ligne lance de cette exception:
Serveur RPC n'est pas disponible
Ce qui peut provoquer cette exception?
La solution
ABBYY FRE est un objet COM. GetEngineObject()
se comporte comme une normale de l'interface COM de méthode sauf que c'est une fonction distincte.Ce qui signifie que le suivant:il n'est pas autoriser d'exceptions propagées à l'extérieur.Pour y parvenir, il intercepte toutes les exceptions, les convertit en HRESULT
valeurs et, éventuellement, met en place IErrorInfo
.
Vous essayez d'analyser l'exception lancée à l'intérieur d'une méthode ont pas de chances de trouver quel est le problème.C'est parce que en interne, il peut fonctionner comme ceci:
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() );
}
}
donc, l'appel peut intercepter des exceptions et de les traduire afin de fournir des diagnostics.Afin d'obtenir tha diagnostics vous avez besoin de récupérer IErrorInfo*
après la fonction retuns.Utilisation du code de check()
fonction à partir de l'exemple de projet pour qui.Il suffit de ne pas regarder à l'exception levée - vous n'avez pas de chances, laissez-la propager et être traduits.