【问题标题】:Handle possible not existing function in a version of com处理 com 版本中可能不存在的功能
【发布时间】:2017-06-01 07:08:31
【问题描述】:

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

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

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

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

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

我没有使用 LoadLibrary 和 GetProcAddress。

【问题讨论】:

    标签: c++ dll error-handling com


    【解决方案1】:

    第三方 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);
    

    【讨论】:

    • 非常感谢 :) 这正是我所需要的。
    • @Alex,那么你应该给第三方开发者一个重大的咀嚼以打破这条规则。这几乎是您学习在 COM 中创建接口的第一件事。没有任何借口。
    猜你喜欢
    • 2022-11-09
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    相关资源
    最近更新 更多