2010-07-08 3 views
1

У меня есть этот код в проекте C++/CLI:Загрузка ABBYY Engine

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-сервер в не доступном

Что может причину этого исключение?

+0

Какая версия ABBYY FRE это? Выполняются ли функции LoadLibraryEx() и GetEngineObject? Как именно вы видите исключение? – sharptooth

+0

ABBYY Fine Reader Engine 9.0 Visual Studio бросает мне исключение во время вызова pGetEngineObject. –

+1

Вы хотите сказать, что отладчик говорит, что это было исключение? Если это так - после возврата GetEngineObject() используйте код, который вы найдете в функции check(), чтобы получить IErrorInfo * и текст описания. Этот текст объяснит, что случилось. – sharptooth

ответ

2

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* после функции retuns. Используйте код из check() функции из того же проекта проекта для этого. Просто не смотрите на исключение, которое бросают - у вас нет шансов с этим, пусть он распространяется и переводится.