【问题标题】:Create A COM object inside another COM object在另一个 COM 对象中创建一个 COM 对象
【发布时间】:2011-09-10 16:55:01
【问题描述】:

我有以下界面。该接口返回ISystemCmds 接口作为GetSystemCommandInterface 方法的一部分。我们使用 ATL 来创建 COM。

interface IDevice : IDispatch{  
 [id(1), helpstring("method Connect")] HRESULT Connect([in] VARIANT varPortNo);    
 [id(2), helpstring("method GetSystemCommandInterface")] HRESULT GetSystemCommandInterface([out,retval] ISystemCmds** pISystemCmd);    
};

应该添加什么代码(以及在哪里)为ISystemCmds if 创建 COM 对象

一个。作为IDevice的COM对象创建的一部分,我正在为ISystemCmds创建COM对象?
湾。我在GetSystemCommandInterface() 方法中创建COM 对象?

【问题讨论】:

  • 我们需要更深入! (对不起)

标签: c++ com windows-ce atl


【解决方案1】:

使用 ATL 向导创建 ISystemCmds 的实现。然后通过普通的 CoCreateInstance 创建对象,或者如果您需要以 ISystemCmds 不支持的方式初始化对象,则使用 CComObject 模板(参见方法 CreateInstance)。请注意,CComObject::CreateInstance() 不会像 QueryInterface() 和 CoCreateInstance() 那样 AddRef() 您的对象。在传递对象之前添加对象!

【讨论】:

    【解决方案2】:

    获取新的 COM 对象是一项繁重的操作,因此我认为您应该考虑一种变体,其中一个类实现多个接口,因为我认为 ISystemCmds 不会超过 IDevice 是一个完全有效的假设。所以考虑使用同一个类实现这两个接口并在GetSystemCommandInterface 内部调用QueryInterface

    【讨论】:

    • 您不能实现两个 IDispatch 接口,并期望它可以与后期绑定客户端一起使用。你必须这样做。
    • 如果他需要 IDispatch 和后期绑定功能,我认为 OP 应该精确,但他仍然可以对ATL::IDispatchImpl 使用一些解决方法,如 codeproject.com/KB/atl/IDispatchImplEx.aspx> 中所述
    • 甜蜜的模板!我想它无法解决接口成员之间的名称冲突(IX::X vs IY::X),但可以在接口级别设计。
    猜你喜欢
    • 1970-01-01
    • 2011-09-08
    • 2018-10-23
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    相关资源
    最近更新 更多