6 、 com 与类库

27
1 6 COM 与与与 1 与与与与与 2 MFC 3 ATL 4 IDE COM 与与与

Upload: mannix-sanford

Post on 14-Mar-2016

92 views

Category:

Documents


8 download

DESCRIPTION

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

TRANSCRIPT

Page 1: 6 、 COM 与类库

1

6 、 COM 与类库

( 1 )类库的作用( 2 ) MFC( 3 ) ATL( 4 ) IDE

COM 与类库

Page 2: 6 、 COM 与类库

2

直接利用 C++ 语言开发 COM 程序需要处理许多重复性工作例如 IUnknown 接口的实现类厂的实现

DLL 程序入口函数 等建立一套标准的类库非常有意义VC++ 提供了两套这样的类库: MFC 库

ATL 库

( 1 )类库的作用 COM 与类库

Page 3: 6 、 COM 与类库

3

( 2 ) MFC

基本思路:采用内嵌接口类成员的方式实现多接口 COM 对象 未采用多重继承方式

实现方式:CCmdTarget 提供 COM 对象实现的所有支持利用接口映射表实现任意多个接口COleObjectFactory 实现通用类厂

COM 与类库

Page 4: 6 、 COM 与类库

4

#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; \

CCmdTarget 定义的接口映射表( afxwin.h )COM 与类库

Page 5: 6 、 COM 与类库

5

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

};

宏定义中用到的数据结构( afxwin.h ) COM 与类库

Page 6: 6 、 COM 与类库

6

#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 } \

}; \

接口映射表的进一步定义( afxdisp.h ) COM 与类库

Page 7: 6 、 COM 与类库

7

BEGIN_INTERFACE_MAP(COMPONENT, CCmdTarget)INTERFACE_PART(COMPONENT, IID_IX, IX)INTERFACE_PART(COMPONENT, IID_IY, IY)

END_INTERFACE_MAP()

接口映射表的使用方法: COM 与类库

Page 8: 6 、 COM 与类库

8

COleObjectFactory 实现通用类厂COleObjectFactory 是一个通用的类厂

从 CCmdTarget 派生并实现了 IClassFactory2 接口定义内嵌的类厂对象:#define DECLARE_OLECREATE(class_name) \public: \

static AFX_DATA COleObjectFactory factory; \static AFX_DATA const GUID guid; \

利用 COM 对象提供 CLSID 和运行时刻类型信息完成对象的创建工作

COM 与类库

Page 9: 6 、 COM 与类库

9

( 3 ) ATL

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

COM 与类库

Page 10: 6 、 COM 与类库

10

定义 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 与类库

Page 11: 6 、 COM 与类库

11

定义对象映射表#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 },

COM 与类库

Page 12: 6 、 COM 与类库

12

( 4 ) IDE

VC++VBPBDELPHI 等

COM 与类库

Page 13: 6 、 COM 与类库

13

七、 COM 与 CORBA

1 、共同点2 、不同点3 、相互协作4 、相互竞争

COM 与 CORBA

Page 14: 6 、 COM 与类库

14

1 、共同点都是二进制互操作标准 提供应用集成能力

支持软件复用支持系统演化支持分布处理

COM 与 CORBA

Page 15: 6 、 COM 与类库

15

基本框架类似CORBA : IDL

DIIORBCOSS (事务、事件、安全等)领域

COM : IDLIDispatchCOM 库COM+ ( IIS 、 MTS 、 MSMQ 等)

COM 与 CORBA

Page 16: 6 、 COM 与类库

16

2 、不同点技术源头

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

COM 与 CORBA

Page 17: 6 、 COM 与类库

17

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

COM 与 CORBA

Page 18: 6 、 COM 与类库

18

异构平台COM : 主要在 Windows 、 Macintosh 上

Solaris 也可用MVS 、 HP/UX 等处于 Beta 测试阶段在除了 Windows 之外的系统上性能一般

CORBA : 不同的 ORB 对于异构平台的支持不同多数以支持 UNIX 为基本目标在 Windows 上存在大量 ORB 产品

COM 与 CORBA

Page 19: 6 、 COM 与类库

19

支持工具COM :支持工具多

Visual StudioBC 、 DelphiRoseSymantec C++

CORBA :支持工具逐步增加VC Delphi Symantec Java

COM 与 CORBA

Page 20: 6 、 COM 与类库

20

3 、相互协作( 1 )微软参与 OMG 工作向 ORB 厂商提供 COM licenseIONA ExpersoftBEAInpriseHPVisual Egde

COM 与 CORBA

Page 21: 6 、 COM 与类库

21

( 2 ) OMG

规范中规定 COM/CORBA Interworking

COM 与 CORBA

Page 22: 6 、 COM 与类库

22

Page 23: 6 、 COM 与类库

23

Page 24: 6 、 COM 与类库

24

( 3 )其它厂商提供协作产品

IONA Orbix :Expersoft PowerBrokerBEA ObjectBrokerInprise VisiBrokerHP ORB PlusVisual Edge ObjectBridge

COM 与 CORBA

Page 25: 6 、 COM 与类库

25

4 、相互竞争( 1 )互操作标准

标准是技术标准是产品

标准是市场标准是唯一的

COM 与 CORBA

Page 26: 6 、 COM 与类库

26

( 2 )平台 COM 与 CORBA

平台是多样的平台是不断发展的

( 3 )应用领域应用领域是各具特色的

应用领域是不断扩展的

Page 27: 6 、 COM 与类库

27

相互竞争相互借鉴共同发展

COM 与 CORBA