Article ID: 173823
Article Last Modified on 6/29/2004
class ATL_NO_VTABLE COutObj :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<COutObj, &CLSID_OutObj>,
public IDispatchImpl<IOutObj, &IID_IOutObj, &LIBID_OUTEROBJLib>
{
public:
COutObj() : m_pInnerUnk(NULL) // Step 1
{
}
DECLARE_GET_CONTROLLING_UNKNOWN()
DECLARE_REGISTRY_RESOURCEID(IDR_OUTOBJ)
DECLARE_PROTECT_FINAL_CONSTRUCT() // Step 2
BEGIN_COM_MAP(COutObj)
COM_INTERFACE_ENTRY(IOutObj)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY_AGGREGATE(IID_IInnObj, m_pInnerUnk) // Step 3
END_COM_MAP()
// Start of step 4
HRESULT FinalConstruct()
{
HRESULT hr;
CLSID clsidInner;
hr = CLSIDFromProgID(L"InnObj.InnObj.1", &clsidInner);
if (hr == S_OK)
hr = CoCreateInstance(clsidInner, GetControllingUnknown(),
CLSCTX_INPROC_SERVER, IID_IUnknown,
(void**)&m_pInnerUnk);
return hr;
} // End of step 4
void FinalRelease(){m_pInnerUnk->Release();} // Step 5
// IOutObj
public:
STDMETHOD(Test)();
private:
LPUNKNOWN m_pInnerUnk; // Step 1
};
If the inner object is in the same ATL server, then you can use the
following code to create the inner object without CoCreateInstance:
HRESULT FinalConstruct()
{
return CInnObj::_CreatorClass::CreateInstance(
GetControllingUnknown(), IID_IUnknown,
(void**)&m_pInnerUnk);
}
Additional query words: derive override kbATL210 kbATL300 kbctrl kbserver
Keywords: kbhowto kbarchitecture KB173823