2017-01-17 19 views
1

我對com處理有疑問。處理com版本中可能不存在的函數

我正在使用第三方dll,我通過#import包含,使用named_guids作爲參數。我不知道我是否應該使用另一個參數或不適當的導入..?

問題是存在不同版本的dll。我正在使用的一個特定功能是在最後一個dll版本中添加的。因此,如果客戶擁有較舊的版本,則會出現異常 - 執行位置(某地址)的訪問衝突。我明白這個錯誤告訴我函數不能被找到,但是如何捕獲這個異常呢?

我試着用的try-catch(_com_error) - 沒什麼,的try-catch(的std ::除外) - 什麼都沒有,甚至的try-catch(...) - 仍然一無所獲。

我可以捕獲這種異常並記錄異常並告訴客戶dll有問題嗎?

我沒有使用LoadLibrary和GetProcAddress。

回答

0

第三方DLL的開發人員違反了COM的核心原則:接口是不可變的。這意味着一旦發佈,界面可能不會改變。您會看到未遵循此規則時發生的情況:您對不存在的方法的調用會導致訪問衝突。

如果COM接口來自IDispatch,那麼您可以使用一種簡單的方法來檢查方法是否存在:使用GetIDsOfNames來獲取方法的DISPID。如果它不存在,該函數將與DISP_E_UNKNOWNNAME返回錯誤:

DISPID dispID; 
BSTR methodName = SysAllocString(L"MyMethod"); 
// Check hr return value 
HRESULT hr = piDisp->GetIDsOfNames(IID_NULL, &methodName, 1, LOCALE_SYSTEM_DEFAULT, &dispID); 
SysFreeString(methodName); 
+0

感謝很多:)這正是我需要的。 – Alek

+1

@Alex,那麼你應該給第三方開發者一個主要的咀嚼破壞這個規則。這實際上是您在COM中創建接口時學到的第一件事。沒有任何藉口。 –