代码之家  ›  专栏  ›  技术社区  ›  Qwertie

如何从基类派生ATL COM类?

  •  9
  • Qwertie  · 技术社区  · 17 年前

    “ATL simple object”向导不提供指定新类是从现有coclass及其接口派生的方法。在Visual Studio 2008中,如何从现有的ATL COM类(即。 Base IBase ,我想做一个新的 Derived 类派生自 底座 实现 IDerived ,其中 理想的 是从 .)

    FinalConstruct() FinalRelease() ? 应该 DECLARE_PROTECT_FINAL_CONSTRUCT DECLARE_REGISTRY_RESOURCEID 在派生类中重复?

    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)
    
    2 回复  |  直到 10 年前
        1
  •  1
  •   computinglife    17 年前

    只是一个建议——如果你的COM对象不需要做任何与COM相关的东西,那么你可以实现代码,这样你的基类COM类所做的真实逻辑被封装在另一个普通的C++类中,比如说CaseLoCIC。

    CBaseLogic : IBase
    
    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
    {
    CBaseLogic m_LogicObj; /* Method calls are simply forwarded to this member */
    };
    
    
    CDerivedLogic : public CBaseLogic
    
    class ATL_NO_VTABLE CDerived :
        public CComObjectRootEx<CComSingleThreadModel>,
        public CComCoClass<CDerived, &CLSID_Base>,
        public ISupportErrorInfo,
        public IConnectionPointContainerImpl<CDerived>,
        public CProxy_IBaseEvents<CDerived>,
        public IDispatchImpl<IBase, &IID_IBase, &LIBID_ExampleLib
    {
    CDerivedLogic m_LogicObj;
    };
    

    这就实现了你想利用的附加优势

    1. 使真正的程序逻辑与基础结构/打包(COM)分离
    2. 使真正的逻辑平台独立。
    3. 保持程序逻辑干净,远离COM语法,提高可读性
        2
  •  0
  •   John Dibling    17 年前

    编辑向导生成的代码。如果希望对象从其他接口派生,请将这些基类添加到生成的类声明中。