270 likes | 366 Views
COM 与类库. 6 、 COM 与类库. ( 1 )类库的作用 ( 2 ) MFC ( 3 ) ATL ( 4 ) IDE. ( 1 )类库的作用. COM 与类库. 直接利用 C++ 语言开发 COM 程序 需要处理许多重复性工作 例如 IUnknown 接口的实现 类厂的实现 DLL 程序入口函数 等 建立一套标准的类库非常有意义 VC++ 提供了两套这样的类库: MFC 库 ATL 库. ( 2 ) MFC. COM 与类库. 基本思路: 采用内嵌接口类成员的方式实现多接口 COM 对象
E N D
COM与类库 6、COM与类库 (1)类库的作用 (2)MFC (3)ATL (4)IDE
(1)类库的作用 COM与类库 直接利用 C++语言开发 COM 程序 需要处理许多重复性工作 例如 IUnknown 接口的实现 类厂的实现 DLL程序入口函数 等 建立一套标准的类库非常有意义 VC++提供了两套这样的类库: MFC库 ATL库
(2)MFC COM与类库 基本思路: 采用内嵌接口类成员的方式实现多接口COM对象 未采用多重继承方式 实现方式: CCmdTarget提供COM对象实现的所有支持 利用接口映射表实现任意多个接口 COleObjectFactory实现通用类厂
COM与类库 CCmdTarget定义的接口映射表(afxwin.h) #define DECLARE_INTERFACE_MAP() \ private: \ static const AFX_INTERFACEMAP_ENTRY _interfaceEntries[]; \ protected: \ static AFX_DATA const AFX_INTERFACEMAP interfaceMap; \ static const AFX_INTERFACEMAP* PASCAL _GetBaseInterfaceMap(); \ virtual const AFX_INTERFACEMAP* GetInterfaceMap() const; \
COM与类库 宏定义中用到的数据结构(afxwin.h) struct AFX_INTERFACEMAP_ENTRY { const void* piid; // the interface id (IID) (NULL for aggregate) size_t nOffset; // offset of the interface vtable from m_unknown }; struct AFX_INTERFACEMAP { const AFX_INTERFACEMAP* (PASCAL * pfnGetBaseMap)(); //NULL is root class const AFX_INTERFACEMAP_ENTRY* pEntry; // map for this class };
COM与类库 接口映射表的进一步定义(afxdisp.h) #define BEGIN_INTERFACE_MAP(theClass, theBase) \ const AFX_INTERFACEMAP* PASCAL theClass::_GetBaseInterfaceMap() \ { return &theBase::interfaceMap; } \ const AFX_INTERFACEMAP* theClass::GetInterfaceMap() const \ { return &theClass::interfaceMap; } \ AFX_COMDAT const AFX_DATADEF AFX_INTERFACEMAP theClass::interfaceMap = \ { &theClass::_GetBaseInterfaceMap, &theClass::_interfaceEntries[0], }; \ AFX_COMDAT const AFX_DATADEF AFX_INTERFACEMAP_ENTRY theClass::_interfaceEntries[] = \ { \ #define INTERFACE_PART(theClass, iid, localClass) \ { &iid, offsetof(theClass, m_x##localClass) }, \ #define END_INTERFACE_MAP() \ { NULL, (size_t)-1 } \ }; \
COM与类库 接口映射表的使用方法: BEGIN_INTERFACE_MAP(COMPONENT, CCmdTarget) INTERFACE_PART(COMPONENT, IID_IX, IX) INTERFACE_PART(COMPONENT, IID_IY, IY) END_INTERFACE_MAP()
COM与类库 COleObjectFactory实现通用类厂 COleObjectFactory是一个通用的类厂 从CCmdTarget派生 并实现了IClassFactory2接口 定义内嵌的类厂对象: #define DECLARE_OLECREATE(class_name) \ public: \ static AFX_DATA COleObjectFactory factory; \ static AFX_DATA const GUID guid; \ 利用COM对象提供CLSID和运行时刻类型信息 完成对象的创建工作
(3)ATL COM与类库 基于模板的C++类库 用于建立小巧、快速 COM构件程序 其内部模板类实现了COM的一些 基本特征:IUnknown、IClassFactory、Idispatch等 及高级特征:dual interface、 connection point等 使用多重继承的方式实现COM接口
COM与类库 定义COM映射表等 #define BEGIN_COM_MAP(x) public: \ typedef x _ComMapClass; \ static HRESULT WINAPI _Cache(void* pv, REFIID iid, \ void** ppvObject, DWORD dw)\ {\ _ComMapClass* p = (_ComMapClass*)pv;\ p->Lock();\ HRESULT hRes = CComObjectRootBase::_Cache(pv, iid, ppvObject, dw);\ p->Unlock();\ return hRes;\ }\ …...
COM与类库 定义对象映射表 #define BEGIN_OBJECT_MAP(x) static _ATL_OBJMAP_ENTRY x[] = { #define END_OBJECT_MAP() {NULL, NULL, NULL, NULL, NULL,\ NULL, NULL, NULL}}; #define OBJECT_ENTRY(clsid, class) {&clsid, class::UpdateRegistry, \ class::_ClassFactoryCreatorClass::CreateInstance, \ class::_CreatorClass::CreateInstance, NULL, 0, \ class::GetObjectDescription, class::GetCategoryMap, class::ObjectMain }, #define OBJECT_ENTRY_NON_CREATEABLE(class) {&CLSID_NULL, \ class::UpdateRegistry, NULL, NULL, NULL, 0, NULL, \ class::GetCategoryMap, class::ObjectMain },
(4)IDE COM与类库 VC++ VB PB DELPHI 等
COM 与 CORBA 七、COM 与 CORBA 1、共同点 2、不同点 3、相互协作 4、相互竞争
1、共同点 COM 与 CORBA 都是二进制互操作标准 提供应用集成能力 支持软件复用 支持系统演化 支持分布处理
COM 与 CORBA 基本框架类似 CORBA:IDL DII ORB COSS(事务、事件、安全等) 领域 COM: IDL IDispatch COM库 COM+(IIS、MTS、MSMQ等)
COM 与 CORBA 2、不同点 技术源头 COM: 从DDE、OLE等基础上发展 先有现有技术与产品 后提炼模型 CORBA:不同厂商联合制订 先有规范 后开发或改造支持规范的产品
COM 与 CORBA 实现方式 COM: COM库函数参与服务器对象的构造 然后客户与服务器直接通信 是操作系统的一部分 CORBA:ORB负责客户与服务器的所有活动 包括 服务器对象的建立 客户与服务器的操作 可以是操作系统的一部分 也可以是独立的应用程序
COM 与 CORBA 异构平台 COM: 主要在Windows、Macintosh上 Solaris也可用 MVS、HP/UX等处于Beta测试阶段 在除了Windows之外的系统上 性能一般 CORBA: 不同的ORB对于异构平台的支持不同 多数以支持UNIX为基本目标 在Windows上存在大量ORB产品
COM 与 CORBA 支持工具 COM:支持工具多 Visual Studio BC、Delphi Rose Symantec C++ CORBA:支持工具逐步增加 VC Delphi Symantec Java
COM 与 CORBA 3、相互协作 (1)微软 参与OMG工作 向ORB厂商提供COM license IONA Expersoft BEA Inprise HP Visual Egde
COM 与 CORBA (2)OMG 规范中规定 COM/CORBA Interworking
COM 与 CORBA (3)其它厂商提供协作产品 IONA Orbix: Expersoft PowerBroker BEA ObjectBroker Inprise VisiBroker HP ORB Plus Visual Edge ObjectBridge
COM 与 CORBA 4、相互竞争 (1)互操作标准 标准是技术 标准是产品 标准是市场 标准是唯一的
COM 与 CORBA (2)平台 平台是多样的 平台是不断发展的 (3)应用领域 应用领域是各具特色的 应用领域是不断扩展的
COM 与 CORBA 相互竞争 相互借鉴 共同发展