Pergunta

Eu tenho este código no projeto 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 )

a última linha lança esta exceção:

Servidor RPC não disponível

O que pode causar essa exceção?

Foi útil?

Solução

ABBYY FRE é um objeto COM. GetEngineObject() se comporta como um método de interface COM normal, exceto que é uma função separada.O que significa o seguinte:não permite que exceções se propaguem para fora.Para conseguir isso, ele captura todas as exceções, traduz-as em HRESULT valores e possivelmente configura IErrorInfo.

Você tentando analisar a exceção lançada dentro de um método não tem chances de descobrir qual é o problema.Isso porque internamente pode funcionar assim:

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

portanto, a chamada real pode capturar exceções e traduzi-las para fornecer diagnósticos significativos.Para obter esse diagnóstico você precisa recuperar IErrorInfo* após o retorno da função.Usar código de check() função do mesmo projeto de exemplo para isso.Apenas não olhe para a exceção sendo lançada - você não tem chances com isso, deixe-a se propagar e ser traduzida.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top