1 / 27

6 、 COM 与类库

COM 与类库. 6 、 COM 与类库. ( 1 )类库的作用 ( 2 ) MFC ( 3 ) ATL ( 4 ) IDE. ( 1 )类库的作用. COM 与类库. 直接利用 C++ 语言开发 COM 程序 需要处理许多重复性工作 例如 IUnknown 接口的实现 类厂的实现 DLL 程序入口函数 等 建立一套标准的类库非常有意义 VC++ 提供了两套这样的类库: MFC 库 ATL 库. ( 2 ) MFC. COM 与类库. 基本思路: 采用内嵌接口类成员的方式实现多接口 COM 对象

Download Presentation

6 、 COM 与类库

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. COM与类库 6、COM与类库 (1)类库的作用 (2)MFC (3)ATL (4)IDE

  2. (1)类库的作用 COM与类库 直接利用 C++语言开发 COM 程序 需要处理许多重复性工作 例如 IUnknown 接口的实现 类厂的实现 DLL程序入口函数 等 建立一套标准的类库非常有意义 VC++提供了两套这样的类库: MFC库 ATL库

  3. (2)MFC COM与类库 基本思路: 采用内嵌接口类成员的方式实现多接口COM对象 未采用多重继承方式 实现方式: CCmdTarget提供COM对象实现的所有支持 利用接口映射表实现任意多个接口 COleObjectFactory实现通用类厂

  4. 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; \

  5. 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 };

  6. 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 } \ }; \

  7. COM与类库 接口映射表的使用方法: BEGIN_INTERFACE_MAP(COMPONENT, CCmdTarget) INTERFACE_PART(COMPONENT, IID_IX, IX) INTERFACE_PART(COMPONENT, IID_IY, IY) END_INTERFACE_MAP()

  8. COM与类库 COleObjectFactory实现通用类厂 COleObjectFactory是一个通用的类厂 从CCmdTarget派生 并实现了IClassFactory2接口 定义内嵌的类厂对象: #define DECLARE_OLECREATE(class_name) \ public: \ static AFX_DATA COleObjectFactory factory; \ static AFX_DATA const GUID guid; \ 利用COM对象提供CLSID和运行时刻类型信息 完成对象的创建工作

  9. (3)ATL COM与类库 基于模板的C++类库 用于建立小巧、快速 COM构件程序 其内部模板类实现了COM的一些 基本特征:IUnknown、IClassFactory、Idispatch等 及高级特征:dual interface、 connection point等 使用多重继承的方式实现COM接口

  10. 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;\ }\ …...

  11. 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 },

  12. (4)IDE COM与类库 VC++ VB PB DELPHI 等

  13. COM 与 CORBA 七、COM 与 CORBA 1、共同点 2、不同点 3、相互协作 4、相互竞争

  14. 1、共同点 COM 与 CORBA 都是二进制互操作标准 提供应用集成能力 支持软件复用 支持系统演化 支持分布处理

  15. COM 与 CORBA 基本框架类似 CORBA:IDL DII ORB COSS(事务、事件、安全等) 领域 COM: IDL IDispatch COM库 COM+(IIS、MTS、MSMQ等)

  16. COM 与 CORBA 2、不同点 技术源头 COM: 从DDE、OLE等基础上发展 先有现有技术与产品 后提炼模型 CORBA:不同厂商联合制订 先有规范 后开发或改造支持规范的产品

  17. COM 与 CORBA 实现方式 COM: COM库函数参与服务器对象的构造 然后客户与服务器直接通信 是操作系统的一部分 CORBA:ORB负责客户与服务器的所有活动 包括 服务器对象的建立 客户与服务器的操作 可以是操作系统的一部分 也可以是独立的应用程序

  18. COM 与 CORBA 异构平台 COM: 主要在Windows、Macintosh上 Solaris也可用 MVS、HP/UX等处于Beta测试阶段 在除了Windows之外的系统上 性能一般 CORBA: 不同的ORB对于异构平台的支持不同 多数以支持UNIX为基本目标 在Windows上存在大量ORB产品

  19. COM 与 CORBA 支持工具 COM:支持工具多 Visual Studio BC、Delphi Rose Symantec C++ CORBA:支持工具逐步增加 VC Delphi Symantec Java

  20. COM 与 CORBA 3、相互协作 (1)微软 参与OMG工作 向ORB厂商提供COM license IONA Expersoft BEA Inprise HP Visual Egde

  21. COM 与 CORBA (2)OMG 规范中规定 COM/CORBA Interworking

  22. COM 与 CORBA (3)其它厂商提供协作产品 IONA Orbix: Expersoft PowerBroker BEA ObjectBroker Inprise VisiBroker HP ORB Plus Visual Edge ObjectBridge

  23. COM 与 CORBA 4、相互竞争 (1)互操作标准 标准是技术 标准是产品 标准是市场 标准是唯一的

  24. COM 与 CORBA (2)平台 平台是多样的 平台是不断发展的 (3)应用领域 应用领域是各具特色的 应用领域是不断扩展的

  25. COM 与 CORBA 相互竞争 相互借鉴 共同发展

More Related