Maanu
Maanu

Reputation: 5203

Create A COM object inside another COM object

I have the following interface. The interface returns ISystemCmds interface as part of GetSystemCommandInterface method. We are using ATL for creating the 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);    
};

What code should add (and where) for creating the COM object for ISystemCmds if

a. I am creating the COM object for ISystemCmds as part of COM object creation of IDevice?
b. I am creating the COM object in GetSystemCommandInterface() method?

Upvotes: 3

Views: 546

Answers (2)

Jörgen Sigvardsson
Jörgen Sigvardsson

Reputation: 4887

Use the ATL wizard to create the implementation of ISystemCmds. Then create the object through normal CoCreateInstance, or use the CComObject<> template (see method CreateInstance) if you need to initialize the object in a way that ISystemCmds does not support. Be aware that CComObject<>::CreateInstance() does not AddRef() your object like QueryInterface() and CoCreateInstance() do. AddRef the object before passing it along!

Upvotes: 2

jszpilewski
jszpilewski

Reputation: 1632

Getting new COM objects is rather a heavy operation so I think you should consider a variant where one class implements several interfaces as I think it is a perfectly valid assumption that ISystemCmds is not going to outlive IDevice. So think about implementing both interfaces using the same class and calling QueryInterface inside of GetSystemCommandInterface.

Upvotes: 1

Related Questions