2017-01-17 21 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中创建接口时学到的第一件事。没有任何借口。 –