2011-06-08 160 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