在另一个 COM 对象中创建一个 COM 对象
Posted
技术标签:
【中文标题】在另一个 COM 对象中创建一个 COM 对象【英文标题】:Create A COM object inside another COM object 【发布时间】: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 对象?
【问题讨论】:
我们需要更深入! (对不起) 【参考方案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),但可以在接口级别设计。以上是关于在另一个 COM 对象中创建一个 COM 对象的主要内容,如果未能解决你的问题,请参考以下文章
在另一个 objectB 中创建 objectA 时,objectA 是不是是 objectS 的本地对象,并且 objectS 是不是存在于对象实例化之外?