c++ - 处理 com 版本中可能不存在的功能

标签 c++ dll error-handling com

我有一个关于 com 处理的问题。

我正在使用通过#import 包含的第三方 dll,使用 named_guids 作为参数。我不知道我是否应该使用另一个参数来正确导入..?

问题是有不同版本的dll。我正在使用的一个特定功能是在最新版本的 dll 中添加的。因此,如果客户有旧版本,则会出现异常 - 访问冲突执行位置(某个地址)。我明白错误是告诉我找不到函数,但是如何捕获这个异常呢?

我尝试了 try-catch(_com_error) - 什么都没有,try-catch(std::exception) - 什么都没有,甚至 try-catch(. ..) - 仍然没有。

我可以捕获这种异常并记录异常并告诉客户dll 有问题吗?

我没有使用 LoadLibrary 和 GetProcAddress。

最佳答案

第三方DLL的开发者违反了COM的一个核心原则:接口(interface)是不可变的。这意味着一旦发布,界面可能不会发生任何变化。您将看到不遵守此规则时发生的后果:您对不存在的方法的调用导致访问冲突。

如果 COM 接口(interface)派生自 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);

关于c++ - 处理 com 版本中可能不存在的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41693432/

相关文章:

python - 使用django上传图片

c++ - C++ 中的整数范围——当标准还不存在时我该怎么办?

java - 如何解决 Tomcat 应用程序访问的内存泄漏第 3 方 DLL(无源代码)?

validation - CakePHP的 “baked” date字段验证错误

c# - 无法引用 Microsoft.SharePoint.Client.dll

c# - 仅包含接口(interface)的 WinRT 组件 DLL?

javascript - 在 NodeJS 中模拟发出 "Socket hang up"

c++ - 我刚刚做了什么? C++中的内存泄漏?

python - 是否有等同于 python 的 functools.partial 的 C++

c++ - 使用 VC++ 的 __assume 是否可能带来可衡量的性能提升?