Загрузка ABBYY Engine - PullRequest
       36

Загрузка ABBYY Engine

2 голосов
/ 08 июля 2010

У меня есть этот код в проекте 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 )

последняя строка выдает это исключение:

Сервер RPC недоступен

Что может вызвать это исключение?

1 Ответ

2 голосов
/ 22 июля 2010

ABBYY FRE является COM-объектом. GetEngineObject() ведет себя как обычный метод интерфейса COM, за исключением того, что это отдельная функция. Это означает следующее: оно не позволяет распространяться исключениям за пределами. Для достижения этого он перехватывает все исключения, переводит их в соответствующие значения HRESULT и, возможно, устанавливает IErrorInfo.

Вы пытаетесь проанализировать исключение, генерируемое в методе, не можете найти, в чем проблема. Это потому, что внутренне это может работать так:

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

чтобы реальный вызов мог перехватывать исключения и переводить их для обеспечения содержательной диагностики. Чтобы получить эту диагностику, вам нужно получить IErrorInfo* после перезапуска функции. Для этого используйте код из функции check() из того же примера проекта. Только не смотрите на создаваемое исключение - у вас нет шансов на это, пусть оно распространяется и переводится.

...