在另一个 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 对象的主要内容,如果未能解决你的问题,请参考以下文章

使用在另一个 Swift VC 文件中创建的对象?

如何调用在另一个函数中创建的对象

在另一个活动中创建的对象在主活动中不可见

在另一个 objectB 中创建 objectA 时,objectA 是不是是 objectS 的本地对象,并且 objectS 是不是存在于对象实例化之外?

使用 C++ 调用 C# 时无法在另一个应用程序域中创建对象

C#winform中为啥一个窗体的对象可以调用在另一个窗体中创建的一个类未实例化下