2010-07-08 45 views
1

我有這樣的代碼在C++/CLI項目:加載ABBYY引擎

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 2010-07-12 11:03:25

+0

ABBYY Fine Reader Engine 9.0 在pGetEngineObject調用期間,Visual Studio引發異常。 – 2010-07-19 08:05:37

+1

你的意思是調試器說這是一個異常拋出?如果是這樣 - 在GetEngineObject()返回之後,使用您在check()函數中找到的代碼來檢索IErrorInfo *和description文本。該文本將解釋什麼是錯的。 – sharptooth 2010-07-21 10:32:06

回答

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*。使用來自相同示例項目的check()函數的代碼。只是不要盯着拋出的異常 - 你沒有機會,讓它傳播和翻譯。