Upload
mannix-sanford
View
97
Download
8
Embed Size (px)
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
Citation preview
1
6 、 COM 与类库
( 1 )类库的作用( 2 ) MFC( 3 ) ATL( 4 ) IDE
COM 与类库
2
直接利用 C++ 语言开发 COM 程序需要处理许多重复性工作例如 IUnknown 接口的实现类厂的实现
DLL 程序入口函数 等建立一套标准的类库非常有意义VC++ 提供了两套这样的类库: MFC 库
ATL 库
( 1 )类库的作用 COM 与类库
3
( 2 ) MFC
基本思路:采用内嵌接口类成员的方式实现多接口 COM 对象 未采用多重继承方式
实现方式:CCmdTarget 提供 COM 对象实现的所有支持利用接口映射表实现任意多个接口COleObjectFactory 实现通用类厂
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 与类库
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 与类库
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 与类库
7
BEGIN_INTERFACE_MAP(COMPONENT, CCmdTarget)INTERFACE_PART(COMPONENT, IID_IX, IX)INTERFACE_PART(COMPONENT, IID_IY, IY)
END_INTERFACE_MAP()
接口映射表的使用方法: 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 与类库
9
( 3 ) ATL
基于模板的 C++ 类库用于建立小巧、快速 COM 构件程序其内部模板类实现了 COM 的一些 基本特征: IUnknown 、 IClassFactory 、 Idispatch 等及高级特征: dual interface 、 connection point 等使用多重继承的方式实现 COM 接口
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 与类库
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 与类库
12
( 4 ) IDE
VC++VBPBDELPHI 等
COM 与类库
13
七、 COM 与 CORBA
1 、共同点2 、不同点3 、相互协作4 、相互竞争
COM 与 CORBA
14
1 、共同点都是二进制互操作标准 提供应用集成能力
支持软件复用支持系统演化支持分布处理
COM 与 CORBA
15
基本框架类似CORBA : IDL
DIIORBCOSS (事务、事件、安全等)领域
COM : IDLIDispatchCOM 库COM+ ( IIS 、 MTS 、 MSMQ 等)
COM 与 CORBA
16
2 、不同点技术源头
COM : 从 DDE 、 OLE 等基础上发展先有现有技术与产品后提炼模型CORBA :不同厂商联合制订先有规范后开发或改造支持规范的产品
COM 与 CORBA
17
实现方式COM : COM 库函数参与服务器对象的构造然后客户与服务器直接通信是操作系统的一部分CORBA : ORB 负责客户与服务器的所有活动包括 服务器对象的建立客户与服务器的操作可以是操作系统的一部分也可以是独立的应用程序
COM 与 CORBA
18
异构平台COM : 主要在 Windows 、 Macintosh 上
Solaris 也可用MVS 、 HP/UX 等处于 Beta 测试阶段在除了 Windows 之外的系统上性能一般
CORBA : 不同的 ORB 对于异构平台的支持不同多数以支持 UNIX 为基本目标在 Windows 上存在大量 ORB 产品
COM 与 CORBA
19
支持工具COM :支持工具多
Visual StudioBC 、 DelphiRoseSymantec C++
CORBA :支持工具逐步增加VC Delphi Symantec Java
COM 与 CORBA
20
3 、相互协作( 1 )微软参与 OMG 工作向 ORB 厂商提供 COM licenseIONA ExpersoftBEAInpriseHPVisual Egde
COM 与 CORBA
21
( 2 ) OMG
规范中规定 COM/CORBA Interworking
COM 与 CORBA
22
23
24
( 3 )其它厂商提供协作产品
IONA Orbix :Expersoft PowerBrokerBEA ObjectBrokerInprise VisiBrokerHP ORB PlusVisual Edge ObjectBridge
COM 与 CORBA
25
4 、相互竞争( 1 )互操作标准
标准是技术标准是产品
标准是市场标准是唯一的
COM 与 CORBA
26
( 2 )平台 COM 与 CORBA
平台是多样的平台是不断发展的
( 3 )应用领域应用领域是各具特色的
应用领域是不断扩展的
27
相互竞争相互借鉴共同发展
COM 与 CORBA