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);