El asistente "Objeto simple ATL" no proporciona una forma de especificar que una nueva clase se deriva de un cocllass existente y su interfaz. En Visual Studio 2008, ¿cómo puedo hacer una nueva clase de ATL COM derivado de una existente (es decir, Base
implementos IBase
, y quiero hacer una nueva clase Derived
derivado de Base
que implementa IDerived
, donde IDerived
se deriva de IBase
.)¿Cómo hacer una clase COM de ATL derivada de una clase base?
Actualización: suena simple, pero una clase ATL generada por asistente tiene hasta seis clases base, un mapa COM y un mapa de punto de conexión. ¿Cuál de estas clases base y mapas deberían repetirse en la clase derivada? Si los mapas se repiten en la clase derivada, ¿deberían contener el contenido del mapa de la clase base o solo los elementos adicionales? ¿Importa el orden de las clases base? ¿Qué hay de FinalConstruct()
y FinalRelease()
? ¿Deberían repetirse DECLARE_PROTECT_FINAL_CONSTRUCT
y DECLARE_REGISTRY_RESOURCEID
en la clase derivada?
Aquí hay una clase de base de muestra que está vacía, excepto en el texto repetido. Ahora, ¿cómo debería ser la clase derivada?
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)
Una clase ATL generada por asistente tiene hasta seis clases base, un mapa COM y un mapa de punto de conexión. ¿Cuál de estas clases base y mapas se deben repetir en la clase derivada, y el orden de las clases base es importante? ¿Qué pasa con FinalConstruct() y FinalRelease()? – Qwertie