目录
第一部分 Windows对象
第一章 OLE2概述
Windows对象:构件对象模式(Component Object Model)
对象和接口
结构化存储与复合文件
标准数据传输及通告
通知单(Notification)
数据对象与剪贴板
数据对象与拖放
数据对象和复合文档
数据对象和DDE
复合文档:对象嵌入
复合文档:对象链接和标记
复合文档:定位激活(直观编辑)
自动化
第二章 约定、C++及示例代码
C还是非C(拟莎士比亚语)
用户定义型:C++类
访问权限(Access Rights)
单一继承性
虚拟函数与抽象函数
多重继承性
示例代码
包含文件:INC目录
库:LIB目录
BUILD目录
三个Amigous:BttnCur,GizmoBar及StatStrip
类库:CLASSLIB目录
接口摸板:INTERFAC目录
章节源文件:CHAPxx目录
Cosmo:一个图形编辑器
Patron:一个页面载体
建立和测试环境
第三章 对象和接口
生命的首要问题,宇宙和对象
Windows对象与C++对象的比较
让我们旅行去
Windows对象与C++对象的其他不同之处
C和C++中的一个简单的对象:RECTEnumerator
RECTEnumerator和IEnumRECT接口
创建RECTEnumerator对象
使用IEnumRECT指针
引用计数
我的最优化王国
调用-使用-释放
IUnKnown,万物之根
QueryInterface和继承(Inheritance)的比较
QueryInterface特性和接口的生命周期
一些数据类型和调用约定
STDMETHOD和相关内容
HRESULT和SCODE
全局唯一标识符:GUID,IID,CLSID
OLE2接口和API函数
客户接口(Custom Interface)
接口和API函数的比较
什么是Windows对象(再次讨论)
小结
第四章 构件对象(构件对象模型)
令人着迷的东西究竟在哪儿
Windows对象的新增应用程序
扩大信息队列
确认建库版本
调用Coinitialize或OleInitialize
调用CoUninitialize或OleUninitialize
内存管理和分配程序对象
来自类标识符的构件对象:构件用户
#include和预编译过的头文件
例示一个构件对象
管理对象及调用CoFreeUnusedLibraries
实现一个构件对象和一个服务器
注册CLSID
实现分类工厂(Class Factory)
展开分类工厂
DLL服务器
EXE服务器
提供一个卸载机制
DLL服务器
EXE服务器
Cosmo的Polyline——一个DLL对象
对象复用性
示例一:对象包含
示例二:对象聚合(Aggregation)
小结
第二部分 面向对象的系统性能——文件和数据的传输
第五章 结构化存储和复合文件
动机的形成
使人紧张不安的Patron文件
去除咖啡因的方法
使你精力充沛却不会紧张不安:复合文件
复合文件的特征
流,存储及位锁存对象
单元的命名
存取模式
交易式存储(Transacted Storage)
增量式存取(Incremental Access\)
共享单元
复合文件对象和接口
存储对象和IStorage接口
存储的复合文件实现
流对象和IStream接口
流的复合文件实现
LockBytes对象和ILockbytes接口
LockBytes的复合文件实现
Stat成员函数及STATSTG
实际使用的复合文件
简单存储:Cosmo
用STGM_CKONVERT“从帽子上拔去野兔毛”
流及文件
复杂的复合文件:Patron
根存储和临时文件
管理子存储
多级认可
File Save As操作
Low-Memory Save As操作
作为内存结构的流
OLE2的其他技术与结构化存储
IPersistStorage、IPersistStream和IPersistFile接口
具有IPersistStorage的一种强化协议
有关构件用户和IPersistStorage:构件Cosmo
有关构件用户和IPersistStorage:Polyline
复合文件的压缩
小结
第六章 使用数据对象的一致数据传送
什么是数据对象
新的和改进的超结构
数据对象和IDataObject接口
FORMATETC枚举器和格式排序
构件数据对象
某些CDataObject功能部件
实现IDataObject
一个(构件)数据对象用户
数据对象的通告和通知单
建立咨询连接
发送通知单作为一个数据对象
对远程通知单的特殊考虑
在通告接收器内部
IDataObject作为一个面向对象数据传递的标准
视图对象和IViewObject接口
IViewObject::Draw
对一个特定设备的呈送
绘制进入一个元文件(Metafile)
终止长时间的重画
其他IViewObject成员函数
IViewObject和通知单
来自OLE2.DLL的自由存取(Freeload)
IDataObject和DDE
小结
第七章 使用数据对象的剪贴板格式
OLE2剪贴板协议
但我想要做的只是拷贝一些简单的数据
一个数据传送构件对象
如果已拥有一个数据对象...Component(构件)Cosmo
如果已经有了扩展的剪贴板处理(Clipboard--handling)代码
简单的数据源和用户:Cosmo
启动/关闭
Copy/Cut
使能Edit/Paste
Paste(粘贴)
选择性粘贴和一个实用的Patron
Paste Special对话框和OLE2UI库
“房客”创建,粘贴
保存及装载"房客"
Copy和Cut
小结
第八章 使用数据对象的拖放操作
源和目标:拖放传送模型
一个循序渐进的拖放实现:Cosmo
设计并实现放目标用户反馈
实现一个放目标对象及IDropTarget接口
IDropTarget::DragEnter
IDropTarget::DragOver
IDropTarget::DragLeave
IDropTarget::Drop
注册并调入放目标对象
设计并实现放源用户反馈
决定拾起事件(Pick Event)
实现一个放源对象及IDropSource接口
调用DoDrapDrop
高级拖放:Patron中的反馈与滚动
"房客"拾起区域和放源
更为高级的放目标击打测试
一个反馈矩形
滚动页面
小结
第三部分 复合文档:OLE
第九章 复合文档和嵌入载体
复合文档机制
被动态
装载态
情况1:InProcServer
情况2:InProcHandler
情况3:缺省处理器(Default Handler)
装载对象:所有情况
绘制对象
运行态
妈妈,爸爸,新的对象是从哪里来的?
载体应用程序的结构
逐步实现嵌入载体
在启动和停机是调用初始化函数
定义现场和管理现场存储
实现现场接口并加入现场变量
实现IOleClientSite
实现现场的加阴影
调入Insert Object对话框
调用OleUIInsertObject
调用OleCreate或OleCreateFromFile
初始化对象
绘制和打印对象
激活对象并加入对象动词菜单
鼠标双击
对象动词菜单
右鼠标按钮弹出式菜单
从剪贴板和拖放传送来创建对象
拷贝和资源嵌入式对象
关闭并删除对象
保存和装载包含嵌套对象的文档
处理图标表示形式(高速缓存控制)
小结
第十章 复合文档和嵌入式服务器(EXE)
服务器应用程序的结构
链接支持及最小服务器和最大服务器的比较
版本号
安装
逐步实现嵌入服务器
在启动和停机时调用初始化函数
创建登记数据库条目
实现和注册一个分类工厂
面向嵌套对象的分类工厂
以-Embedding启动
实现一个携有IUnKnown的初始对象
实现IPersist Storage接口
实现IDataObject接口
实现IOleObject接口
平凡函数
必要的函数
可选的函数
但它仍然不能工作
修改服务器的用户接口
发送通知单
(全服务器)加入OLE2剪贴板格式
(任选的)MDI服务器用户接口和停机
小结
第十一章 IN-PROCESS对象处理器和服务器
在处理模块的结构
为什么要使用处理器
为什么使用在处理服务器
为什么不使用在处理服务器
委托给缺省处理器
IOleObject
IDataObject
IPersistStorage(在高速缓存上)
IViewObject
实现一个对象处理器
获得缺省处理器IUnKnown
在QueryInterface中采用缺省处理器接口
实现IPersistStorage
实现IOleObject::GetExtent
实现IViewObject
要与当地服务器齐头并进
年终奖
对实现一个在处理服务器的附注
小结
第十二章 标记和链接载体
谁愿意解决一下"什么是一个标记"这个问题?
标记类
合成标记
文件标记
项目标记
逆向标记和指针标记
用户标记
从何处获得标记
逐步链接载体
从Insert Object(插入对象)中使链路得以实现
从剪贴板和拖放操作中使链接得以实现
粘贴链路和粘贴特定命令
拖放链接反馈
测试链接
实现show Object(示出对象)命令
管理一个文件标记,调用IOleObject::SetMoniker,并实现IOleClientSite::GetMoniker
Links(链路)对话框和IOleUILinkContainer接口
调入Links对话框
在装载一个文档时更新链路
小结
第十三章 标记联编和链路源
标记联编机制
一个简单的链接对象:单个文件标记
一个携一合成的File/Item(文件/项目)标记的链接对象
联编一个合成的File/Item/Item/Item........式标记
联接上下文
运行对象表
一个简单的链路源:Cosmo
创建、登记及撤消--文件标识
在数据传送时提供链接源格式
实现IPersistFile接口
实现IOleObject::SetMoniker和IOleObject::GetMoniker
复杂链接和链接到嵌入
为什么要链接到嵌入
创建并管理合成标记
源生(source)合成标识
以IPersistFile为文档对象实现一个分类工厂
为每个项目标记实现IOleItemContainer
小结
第十四章 与OLE1的转换、模拟和兼容
面向载体的Convert(转换)对话框
支持一个Convert菜单项并调入Convert对话框
处理Convert To选择
处理Active As选择
处理Display As Icon更改
在服务器之间的转换
面向转换的Registration Database(登记数据库)条目
对IPersistStorage的修改
OLE1嵌入对象的转换和模拟
对面向载体的OLE1兼容性的注释
OLE1服务器的异常表现
文件转换
小结
第四部分 复合文档:定位激活
第十五章 可视编辑:定位激活和定位载体
定位对话的动机和内容
从何而始
DoVerb--一个小傻瓜
定位激活
标题条和活动对象加影线
善于交际的菜单
顺便逛逛硬件商店
操作一个活动对象
拔出插头:释放
Active和UI Active以及由里及表(inside-out)的对象
是的,确实是这样的
逐步实现定位载体
准备载体
受限的命令有效性
混合菜单的蕴含
工具空间协商的蕴含
定位骨架定位载体接口
激活和释放对象
混合一个菜单:要摇晃,不要搅拌
协商工具空间
提供定位加速键和焦点
请拐弯:其它杂项
小结
第十六章 复合文档对象的定位激活
定位对象的步骤
驱动器,请准备好对象
实现骨架定位对象接口及对象帮助器函数
实现简单的激活和释放
菜单的汇编和反汇编
创建和消除定位工具
管理和处理加速器
拐第三个弯...我们朝折家走取
实现IOleInPlaceActiveObject::ResizeBorder
实现IOleInPlaceObject::SetObjectRects并调用载体的位置函数
为窗口激活变换实现IOleInPlaceActiveObject函数
实现最小的上下文有关帮助的支持
提供Undo支持
调用IOleInPlaceFrame::SetStatusText
提供有关打开进入一个窗口方面的技术
示出或隐入无模型的弹出式窗口
定位激活将把我们带向哪里
小结