COM编程 笔记2

COM 包容与聚合

在聚合中,聚合的对象应该包含两个IUnknown,一个委托Iunknown,另外一个非委托IUnknown,由于C++不支持同时实现两个IUnknown,

故非委托IUnknown 可以定义如下:

class INondelegationUnknown //命名由自己决定

而委托IUnknown本身不做任何操作,只是判断对象是否被聚合,如果被聚合,则将m_pUnknownOuter(定义的IUnknown接口指针对象)指向外

部对象的IUnknown接口;如果没有被聚合,m_pUnknownOuter为NULL,则委托IUnknown把调用传给非委托IUnknown的相应函数。

 

Win32 SDK 中与COM接口有关的一些宏的说明:

DECLARE_INTERFACE(iface) //声明接口iface,它不从其他的接口派生

DECLARE_INTERFACE_(iface,baseiface) //声明接口iface,它从接口baseiface派生

STDMETHOD(method) //声明接口成员函数method,函数返回类型为HRESULT

STDMETHOD_(type,method) //声明接口成员函数method,函数返回类型为type

 

MFC对COM应用的支持

1. 用嵌套类实现COM接口

2. 接口映射表

  (1)在 CCmdTarget类和其派生类定义中使用宏DECLARE_INTERFACE_MAP()声明接口映射表使用的一些静态成员函数以及两个成员函数;

  (2)在类的实现部分使用BEGIN_INTERFACE_MAP(theClass,theBase)

        INTERFACE_PART(theClass,iid,localClass) //定义每一个接口项

        END_INTERFACE_MAP() 来定义接口映射表;

  (3)定义完接口映射表后,我们接着为每个接口定义嵌套类成员,采用BEGIN_INTERFACE_PART、 INIT_INTERFACE_PART、

    END_INTERFACE_PART封装嵌套类;

  (4)实现嵌套类。

3. 类厂定义由宏DECLARE_OLECREATE(class_name)完成

  然后在COM对象实现时,指定类厂和guid的值,MFC使用宏IMPLEMENT_OLECREATE(class_name,external_name,1,w1,w2,b1,b2,b3,b4,

b5,b6,b7,b8);

  

 

posted @ 2010-06-10 16:08  zhouli  阅读(182)  评论(0编辑  收藏  举报