Der Assistent für einfache ATL-Objekte bietet keine Möglichkeit, anzugeben, dass eine neue Klasse von einer vorhandenen Co-Klasse und ihrer Schnittstelle abgeleitet ist. Wie kann ich in Visual Studio 2008 eine neue ATL COM-Klasse erstellen, die von einer vorhandenen Klasse abgeleitet ist (d. h. Base
implementiert IBase
und ich möchte eine neue Derived
Klasse abgeleitet von Base
die Folgendes implementiert IDerived
, donde IDerived
wird abgeleitet von IBase
.)
Update: Es klingt einfach, aber eine vom Assistenten erzeugte ATL-Klasse hat bis zu sechs Basisklassen, eine COM-Map und eine Connection Point Map. Welche dieser Basisklassen und Maps sollten in der abgeleiteten Klasse wiederholt werden? Wenn Maps in der abgeleiteten Klasse wiederholt werden, sollten sie dann den Inhalt der Basisklassen-Map oder nur die zusätzlichen Elemente enthalten? Spielt die Reihenfolge der Basisklassen eine Rolle? Was ist mit FinalConstruct()
y FinalRelease()
? Sollte DECLARE_PROTECT_FINAL_CONSTRUCT
y DECLARE_REGISTRY_RESOURCEID
in der abgeleiteten Klasse wiederholt werden?
Hier ist eine Beispiel-Basisklasse, die abgesehen von allen Boilerplates leer ist. Wie sollte nun die abgeleitete Klasse aussehen?
class ATL_NO_VTABLE CBase :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CBase, &CLSID_Base>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CBase>,
public CProxy_IBaseEvents<CBase>,
public IDispatchImpl<IBase, &IID_IBase, &LIBID_ExampleLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CBase()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_Base)
BEGIN_COM_MAP(CBase)
COM_INTERFACE_ENTRY(IBase)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CBase)
CONNECTION_POINT_ENTRY(__uuidof(_IBaseEvents))
END_CONNECTION_POINT_MAP()
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
};
OBJECT_ENTRY_AUTO(__uuidof(Base), CBase)