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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top