2011-06-08 175 views
3

我有以下接口。界面返回ISystemCmds界面作为GetSystemCommandInterface方法的一部分。我们使用ATL来创建COM。在另一个COM对象内创建一个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如果

一个创建COM对象添加(和在哪里)。我正在为ISystemCmds创建COM对象,作为IDevice的COM对象创建的一部分? b。我在GetSystemCommandInterface()方法中创建COM对象?

+0

我们需要更深入! (对不起) – 2011-06-08 09:44:19

回答

2

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

1

获得新的COM对象是相当沉重的操作,所以我认为,其中一个类实现多个接口,因为我认为这是一个完全有效的假设,即ISystemCmds不会活得比IDevice你应该考虑的变体。所以考虑使用相同的类来实现两个接口,并在GetSystemCommandInterface内调用QueryInterface

+0

您不能实现两个IDispatch接口,并期望它可以与后期绑定客户端一起使用。你*有*这样做。 – 2011-06-08 09:32:16

+1

我认为OP应该精确,如果他需要IDispatch和后期绑定功能,仍然可以像 jszpilewski 2011-06-08 10:05:46

+0

甜蜜的模板!我想它不能解决接口成员(IX :: X vs IY :: X)之间的名称冲突,但可以在接口级别上设计。 – 2011-06-08 11:01:03