9

“ATL 简单对象”向导不提供指定新类派生自现有 coclass 及其接口的方法。在 Visual Studio 2008 中,如何从现有的 ATL COM 类派生一个新的 ATL COM 类(即Baseimplements IBase,我想创建一个从该 implementsDerived派生的新类,其中派生自。)BaseIDerivedIDerivedIBase

更新:听起来很简单,但是向导生成的 ATL 类最多有六个基类、一个 COM 映射和一个连接点映射。哪些基类和映射应该在派生类中重复?如果在派生类中重复映射,它们应该包含基类映射的内容还是仅包含附加项?基类的顺序重要吗?FinalConstruct()和怎么样FinalRelease()?是否应该在派生DECLARE_PROTECT_FINAL_CONSTRUCTDECLARE_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)
4

2 回答 2

1

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

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 hack
  4. 使您的程序逻辑保持干净并远离 COM 语法,提高可读性
  5. 使在其他形式的封装中更容易重用真实逻辑,例如作为 C DLL
于 2008-12-17T16:07:31.810 回答
0

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

于 2008-11-17T23:41:29.110 回答