目录 1
前言 1
读者对象 2
有关汇编语言的要求 3
书中的代码格式 3
致谢 3
路线图(Road Map) 4
第一部分 Windows对象 9
第一章 OLE 2概述 9
Windows对象:构件对象模式(Component Object Model) 10
对象和接口 12
结构化存储与复合文件 15
标准数据传输及通告 17
通知单(Notification) 18
数据对象和剪贴板 18
数据对象与拖放 19
数据对象和复合文档 19
数据对象和DDE 20
复合文档:对象嵌入 20
复合文档:对象链接和标记 21
自动化 23
复合文档:定位激活(直观编辑) 23
第二章 约定、C++及示例代码 25
C还是非C(拟萨士比亚语) 25
用户定义型:C++类 26
访问权限(Accss Rights) 30
单一继承性 31
虚拟函数与抽象基类 34
多重继承性 36
示例代码 38
包含文件:INC目录 38
库:LIB目录 39
三个Amigos:BttnCur,GizmoBar及StatStrip 40
BUILD目录 40
类库:CLASSLIB目录 41
接口模板:INTERFAC目录 43
章节源文件:CHAPxx目录 44
Cosmo:一个图形编辑器 44
Patron:一个页面载体 46
第三章 对象和接口 51
生命的首要问题,宇宙和对象(拟道格拉斯·埃德姆语) 52
Windows对象与C++对象的比较 55
让我们旅行去 56
类定义 59
对象例示 59
Windows对象与C++对象的其它不同之处 59
对象引用 60
对象毁灭 61
C和C++中的一个简单的对象:RECTEnumerator 61
RECTEnumerator和IEnumRECT接口 62
创建RECTEnumerator对象 84
使用IEnumRECT指针 84
引用计数 85
我的最优化王国 87
调用-使用-释放 88
IUnknown,万物之根 89
QueryInterface和继承(Inheritance)的比较 91
QueryInterface特性和接口的生命周期 91
一些数据类型和调用约定 93
STDMETHOD和相关内容 93
HRESULT和SCODE 94
全局唯一标识符:GUID、IID、CLSID 96
OLE 2接口和API函数 96
客户接口(Custom Interface) 97
接口与API函数的比较 98
什么是Windows对象(再次讨论) 98
小结 99
第四章 构件对象(构件对象模型) 101
令人着迷的东西究竟在哪儿 102
Windows对象的新增应用程序 104
扩大信息队列 104
确认建库版本 105
调用CoInitialize或OleInitialize 106
调用CoUninitialize或OleUninitialize 107
内存管理和分配程序对象 107
来自类标识符的构件对象:构件用户 120
#include<initguid.h>和预编译过的头文件 128
例示一个构件对象 129
管理对象及调用CoFreeUnusedLibraries 132
实现一个构件对象和一个服务器 133
注册CLSID 154
实现分类工厂(Class Factory) 156
展示分类工厂 157
DLL服务器 157
EXE服务器 158
提供一个卸载机制 160
DLL服务器 160
EXE服务器 162
Cosmo的Polyline——一个DLL对象 164
对象复用性 168
示例一:对象包含 169
示例二:对象聚集(Aggregation) 170
小结 176
第二部分 面向对象的系统性能一文件和数据传输 179
第五章 结构化存储和复合文件 179
动机的形成 181
使人紧张不安的Patron文件 181
去除咖啡因的方法 183
使你精力充沛却不会紧张不安:复合文件 185
复合文件的特征 186
流、存储及位锁存对象 186
单元的命名 187
存取模式 188
交易式存储(Transacted Storage) 189
增量式存取(Incremental Access) 190
共享单元 191
复合文件对象和接口 192
存储对象和IStorage接口 192
存储的复合文件实现 193
流对象和IStream接口 195
流的复合文件实现 197
LockBytes对象和ILockbytes接口 197
LockBytes的复合文件实现 197
Stat成员函数及STATSTG 198
简单存储:Cosmo 200
实际使用的复合文件 200
用STGM_CONVERT“从帽子上拔去野兔毛” 207
流及文件 208
复杂的复合文件:Patron 210
根存储和临时文件 229
管理子存储 230
多级认可 231
File Save As操作 233
Low-Memory Save As操作 234
作为内存结构的流 236
OLE 2的其它技术与结构化存储 236
IPersistStorage、IPersistStream和IPersistFile接口 237
具有IPersistStorage的一种强化协议 239
有关构件用户和IPersistStorage:构件Cosmo 241
有关构件对象与IPersistStorage:Polyline 244
复合文件的压缩 250
小结 258
第六章 使用数据对象的一致数据传送 261
什么是数据对象 262
新的和改进的超结构 263
数据对象和IDataObject接口 267
FORMATETC枚举器和格式排序 270
构件数据对象 276
某些CDataObject功能部件 287
实现IDataObject 287
一个(构件)数据对象用户 288
数据对象的通告和通知单 301
建立咨询连接 307
发送通知单作为一个数据对象 310
对远程通知单的特殊考虑 314
在通告接收器内部 315
IDataObject作为一个面向对象数据传递的标准 317
视图对象和IViewObject接口 319
IViewObject∷Draw 320
对一个特定设备的呈送 322
绘制进入一个元文件(Metafile) 322
中止长时间的重画 323
其它IViewObject成员函数 324
IViewObject和通知单 324
来自OLE2.DLL的自由存取(Freeload) 325
IDataObject和DDE 334
小结 335
第七章 使用数据对象的剪贴板格式 337
OLE 2剪贴板协议 338
但我想要做的只是拷贝一些简单的数据! 340
一个数据传送构件对象 342
如果已拥有一个数据对象...Component(构件)Cosmo 353
如果已经有了扩展的剪贴板处理(Clipboard-handling)代码 355
简单的数据源和用户:Cosmo 355
启动/关闭 356
Copy(复制)/Cut(剪切) 357
使能Edit(编辑)/Paste粘贴 358
Paste(粘贴) 359
选择性粘贴和一个实用的Patron 361
Paste Special(选择性粘贴)对话框和OLE2UI库 363
“房客”创建,粘贴 367
保存及装载“房客” 370
Copy和Cut 371
小结 372
第八章 使用数据对象的拖放操作 373
源和目标:拖放传送模型 374
一个循序渐进的拖放实现:Cosmo 379
设计并实现放目标用户反馈 394
实现一个放目标对象及IDropTarget接口 396
IDropTarget∷DragEnter 396
IDropTarget∷DragOver 400
IDropTarget∷DragLeave 401
IDropTarget∷Drop 401
设计并实现放源用户反馈 403
注册并调入放目标对象 403
决定拾起事件(Pick Event) 404
实现一个放源对象及IDropSource接口 404
调用DoDragDrop 405
高级拖放:Patron中的反馈与滚动 407
“房客”拾起区域和放源 408
更为高级的放目标击打测试 410
一个反馈矩形 411
滚动页面 414
小结 419
第九章 复合文档和嵌入载体 421
第三部分复合文档:OLE 421
复合文档机制 422
被动态 422
装载态 423
情况1:InProcServer 425
情况2:InProcHandler 426
情况3:缺省处理器(Default Handler) 426
装载对象:所有情况 428
绘制对象 429
运行态 431
妈妈,爸爸,新的对象是从哪里来的? 432
载体应用程序的结构 434
逐步实现嵌入载体 435
在起动和停机时调用初始化函数 436
定义现场和管理现场存储 436
实现现场接口并加入现场变量 439
实现IAdviseSink 444
实现IOleClientSite 447
实现现场的加阴影 453
调入InSert Object对话框 455
调用OleUIInsertObject 457
调用OleCreate或OleCreateFromFile 459
初始化对象 461
绘制和打印对象 465
激活对象并加入对象动词菜单 465
鼠标双击 468
对象动词菜单 469
右鼠标按钮弹出式菜单 473
从剪贴板和拖放传送来创建对象 475
拷贝和资源(source)嵌入式对象 477
关闭并删除对象 480
保存和装载包含嵌套对象的文档 481
处理图标表示形式(高速缓存控制) 484
小结 486
服务器应用程序的结构 487
第十章 复合文档和嵌入对象服务器(EXE) 487
链接支持及最小服务器和最大服务器的比较 489
版本号 489
安装 489
逐步实现嵌入服务器 490
在启动(Startup)和停机(Shutdown)时调用初始化函数 491
创建登记数据库(Registration Database)条目 491
实现和注册一个分类工厂 496
面向嵌套对象的分类工厂 501
以-Embedding起动 502
实现一个携有IUnknown的初始对象 504
实现IPersist Storage接口 512
实现IDataObject接口 518
实现IOleOjbect接口 527
平凡函数 530
必要的函数 540
可选的函数 543
但它仍然不能工作 544
修改服务器的用户接口 545
发送通知单 549
(全服务器)加入OLE 2剪贴板格式 552
(任选的)MDI服务器用户接口和停机 553
小结 554
第十一章 IN-PROCESS对象处理器和服务器 555
在处理模块的结构 555
为什么要使用处理器 557
为什么使用在处理服务器 558
为什么不使用在处理服务器 558
委托给缺省处理器 559
IOleObject 560
IDataObject 561
IPersistStorage(在高速缓存上) 563
IViewObject 564
实现一个对象处理器 565
获得缺省处理器IUnknown 567
在QueryInterface中采用缺省处理器接口 570
实现IPersistStorage 572
实现IOleObject∷GetExtent 577
实现IViewObject 578
要与当地服务器齐头并进 583
年终奖 587
对实现一个在处理服务器的附注 587
小结 599
第十二章 标记和链接载体 601
谁愿意解决一下“什么是一个标记”这个问题? 602
标记类 603
从何处获得标记? 606
逐步链接载体 607
从Insert Object(插入对象)中使链路得以实现 608
从剪贴板和拖放操作中使链接得以实现 611
粘贴链路和粘贴特定命令 612
拖放链接反馈 615
测试链接 616
警告 617
警告:潜在的难题! 618
实现Show Objects(示出对象)命令 618
并实现IOleClient 623
管理一个文件标记,调用IOleObject∷SetMoniker, 623
Links(链路)对话框和IOleUILinkCotainer接口 627
调入Links对话框 643
在装载一个文档时更新链路 646
小结 649
第十三章 标记联编和链路源 651
标记联编机制 652
一个简单的链接对象:单个文件标记 653
一个携一合成的File!Item(文件/项目)标记的链接对象 655
联编一个合成的 658
联接上下文 660
运行对象表 660
一个简单的链路源:Cosmo 661
创建、登记及撤消一文件标识 662
在数据传送时提供链接源格式 664
实现IPersistFile接口 667
实现IOleObject∷SetMoniker和IOleObject∷GetMoniker 670
复杂链接和链接到嵌入 673
为什么要链接到嵌入? 673
创建并管理合成标记 675
源生(source)合成标识 679
以IPersistFile为文档对象实现一个分类工厂 681
为每个项目标记实现IOleItemContainer 684
小结 697
第十四章 与OLE 1的转换、模拟和兼容 699
面向载体的Convert(转换)对话框 700
支持一个Convert菜单项并调入Convert对话框 701
处理Convert To选择 705
处理Activate As选择 706
处理Display As Icon更改 708
在服务器之间的转换 710
面向转换的Registration Database(登记数据库)条目 711
AutoConvertTo和TreatAs 711
Conversion(转换) 712
对IPersistStorage的修改 713
OLE 1嵌入对象的转换和模拟 715
对面向载体的OLE 1兼容性的注释 720
OLE 1服务器的异常表现 720
文件转换 721
小结 726
第四部分 复合文档:定位激活 729
第十五章 可视编辑:定位激活和定位载体 729
定位对话的动机和内容 730
从何而始呢? 731
DoVerb——一个小傻瓜 732
定位激活 733
操作一个活动对象 739
拨出插头:释放 741
Active和UI Active以及由里及表(inside-out)的对象 741
是的,确实是这样的 742
逐步实现定位载体 742
准备载体 743
实现骨架定位载体接口 745
经验:访问框架和文档的现场要求 747
激活和释放对象 753
经验:服务器仍在运行 755
混合一个菜单:要摇晃,不要搅拌 755
协商工具空间 759
经验:菜单消毁:就这样做(对) 759
经验:焦虑和DeferWindowPos 765
经验:“驯化”ShowObject 765
提供定位加速键和焦点 768
经验:古怪的TranslateAccelerator 771
请拐弯:其它杂项 771
警告 774
小结 780
第十六章 复合文档对象的定位激活 781
定位对象的步骤 781
驱动器,请准备好对象 782
实现骨架定位对象接口及对象帮助器函数 784
实现简单的激活和释放 787
对象装饰 795
菜单的汇编与反汇编 798
警告 801
警告 804
创建和消除定位工具 804
管理和处理加速器 808
拐第三个弯... 我们朝着家走去 810
定位激活将把我们带向哪里 818
小结 822
使用随附软盘的说明 823