《COM技术内幕》读书笔记——第2章 COM接口的实现
来源:互联网 发布:身份证脱壳软件打不开 编辑:程序博客网 时间:2024/06/05 00:16
以下为此章知识点罗列,没有整理和引申。
1. COM接口在C++中是用纯属抽象基类实现的,一个COM组件可以提供多个接口,一个C++类可以使用多继承来实现一个可以提供多个接口的组件。
2. 用__stdcall标记的函数将使用标准的调用约定,即这些函数将在返回到调用者之间将参数从栈中删除。在常规的C/C++调用约定中,栈的清理工作则是由调用者完成的。标准调用约定名称的由来在于所有的Win32API函数,除了那些带有变参的函数外,使用的都是这种调用方式。带有变参的函数所用的仍然是C调用约定,即__cdecl。Windows采用标准的调用约定的原因在于这种约定可以减少代码的大小,另外还有一个原因是早期的Windows是运行于640KB的系统上的。
3. 记住,接口是由没有实现细节的虚纯基类实现的。
4. 类并非组件,在组件开发时不一定非用类不可,只不过用类来实现组件将比其他方法更容易。
5. 接口并非总是继承的,一般使用一个类来实现所有的接口,这样比较简单,易于理解,并且可以使得用C++进行COM编程更为自然。
6. 一个接口是一个函数集合,一个组件则是一个接口集,而一个系统则是一系列组件的集合。接口可以看作是行为。
7. COM的接口不变性,一旦公布了一个接口,那么它将永远保持不变。
8. 多重接口使得多态的重要性更为突出。客户可以按照相同的方式来处理不同的组件。一个组件所支持的接口越多,这些组件就应该越小。一个接口表示的行为越多,它的特定性将越强,因此它被其他组件复用的可能性将越小。对于不能复用的接口,使用此接口的客户代码也将不能复用。
9. 虽然C++可以直接操作和使用实例数据,但COM组件绝不会访问任何实例数据。在COM中,对一个组件的访问只能通过函数完成,而绝不能直接通过变量。
本章还花大篇幅来介绍C++的虚函数表的相关知识——C++程序员必学的基本知识,这是为COM的深刻理解做一个复习式的讲解,如果读者不能完全理解C++的虚函数实现的原理和内存结构,就很难深刻理解COM的原理和实现机制。
以下是接口IX和IX的简单而完整的接口实现例子,这里CA实现了一个支持接口IX和IY的组件,而其客户则是函数main。
//// Iface.cpp// To compile, use: cl Iface.cpp//#include <iostream.h>#include <objbase.h> // Define interface.void trace(const char* pMsg) {cout << pMsg << endl ;}// Abstract interfacesinterface IX{virtual void __stdcall Fx1() = 0 ;virtual void __stdcall Fx2() = 0 ;} ;interface IY{virtual void __stdcall Fy1() = 0 ;virtual void __stdcall Fy2() = 0 ;} ;// Interface implementationclass CA : public IX, public IY{public:// Implement interface IX.virtual void __stdcall Fx1() {cout << "CA::Fx1" << endl ;}virtual void __stdcall Fx2() {cout << "CA::Fx2" << endl ;}// Implement interface IY.virtual void __stdcall Fy1() {cout << "CA::Fy1" << endl ;}virtual void __stdcall Fy2() {cout << "CA::Fy2" << endl ;}} ;// Clientint main(){trace("Client: Create an instance of the component.") ;CA* pA = new CA ;// Get an IX pointer.IX* pIX = pA ;trace("Client: Use the IX interface.") ;pIX->Fx1() ;pIX->Fx2() ;// Get an IY pointer.IY* pIY = pA ;trace("Client: Use the IY interface.") ;pIY->Fy1() ;pIY->Fy2() ;trace("Client: Delete the component.") ;delete pA ;return 0 ;}
输出内容为:
Client:Create an instance of the component.
Client:Use the IX interface.
CA::Fx1
CA::Fx2
Client:Use the IY interface.
CA::Fy1
CA::Fy2
Client:Delete the component
在上例中可以看到客户和组件是通过两个接口来通信的。在接口中实现中使用了两个纯属抽象基类IX和IY。例中的组件是由类CA实现的,它了继承了IX和IY,并实现了两个接口中的所有成员。客户main函数创建了组件的一个实例,并获取了组件所能提供的、指向接口的指针。然后它像使用C++指针那样使用了这两个指针,这是由于接口是用纯基类实现的。
- 《COM技术内幕》读书笔记——第2章 COM接口的实现
- 《COM技术内幕》读书笔记——第1章 组件
- 《COM技术内幕》读书笔记——第6章
- com技术内幕读书笔记2
- com技术内幕读书笔记2
- 《COM技术内幕》读书笔记——第3章 QueryInterface函数
- 《COM技术内幕》读书笔记——第4章 引用计数
- 《COM技术内幕》读书笔记——第5章 动态连接
- 《COM技术内幕》读书笔记——第10章 EXE中的服务器 代码调试
- COM技术内幕 读书笔记——第二章 接 口
- COM技术内幕读书笔记
- COM技术内幕--接口
- com技术内幕--读书笔记(2)
- 读书笔记——COM技术内幕(1)组件
- COM技术内幕 读书笔记——第一章 组件
- com技术内幕读书笔记1
- 对《COM技术内幕》第10章的不满意
- COM技术内幕中聚合的实现
- 前景检测算法-SACON(SAMPLE CONSENSUS)
- 关于AndroidPN的几点吐槽
- appsec usa 2012 video
- 深入理解HTTP协议
- Android Notification的使用
- 《COM技术内幕》读书笔记——第2章 COM接口的实现
- cocos2d-x CCCallFunc系列函数的应用
- 黑马程序员--第二次视频C#基础2
- linux图形比较工具meld
- PSP开发--[1]安装cygwin
- 【转载】《当爱,灰飞烟灭》
- PSP开发--[2]开发环境
- PSP开发--[3]PSP错误代码
- RBAC权限设计实例