第1章 COM背景知识 1
1.1 COM的起源 1
1.1.1 软件业面临的挑战 2
1.1.2 传统解决方案 2
1.1.3 面向对象程序设计方法 3
1.1.4 最终解决方案:组件软件 3
1.1.5 面向对象的组件模型——COM 5
1.2 COM的发展历程 7
1.2.1 COM以前的对象技术:DDE、OLE1、VBX控件 7
1.2.2 COM首次亮相:OLE2 8
1.2.3 Microsoft拥抱Internet:ActiveX 9
1.2.4 更多的新名词:Windows DNA和COM+ 10
1.2.5 远程对象:ORBs和DCOM 11
1.2.6 COM的最新版本:COM+ 11
1.3 COM技术现状 12
1.3.1 COM与CORBA 12
1.3.2 COM与Enterprise Java Beans 13
1.3.3 Windows之外的COM 14
小结 14
第2章 从C++到COM 15
2.1 C++客户重用CH对象——例程DB 15
2.1.1 C++对象 16
2.1.2 客户程序 18
2.2 将C++对象移进DLL中——例程DB_cppdll 21
2.2.1 成员函数的引出 21
2.2.2 内存分配 21
2.2.3 Unicode/ASCII兼容 22
2.2.4 例程实现 22
2.2.4.1 修改接口文件 23
2.2.4.2 修改对象程序 24
2.2.4.3 修改客户程序 25
2.3 C++对象使用抽象基类——例程DB_vtbl 28
2.3.1 问题:私有数据成员被暴露 28
2.3.2 解决方案:抽象基类 28
2.3.2.1 什么是抽象基类(Abstract Base Class) 28
2.3.2.2 实现秘诀:虚函数(Virtual Functions) 29
2.3.3 使用抽象基类 29
2.3.4 例程实现 30
2.3.4.1 修改接口文件 30
2.3.4.2 修改对象程序 31
2.3.4.3 修改客户程序 32
2.4 改由COM库装载C++对象——例程dbalmostcom 33
2.4.1 COM库 33
2.4.2 对象创建的标准入口点 33
2.4.3 标准对象创建API 34
2.4.4 标准对象注册 34
2.4.5 例程实现 35
2.4.5.1 修改接口文件 35
2.4.5.2 修改对象程序 35
2.4.5.3 修改客户程序 37
2.5 将C++对象变成COM对象 38
2.5.1 引用计数 39
2.5.2 多接口 39
2.5.3 IUnknown接口 40
2.5.4 标准类厂接口:IClassFactory 40
2.5.5 对象代码的动态卸载 41
2.5.6 自动注册 42
2.5.7 例程实现 42
2.5.7.1 修改接口文件 42
2.5.7.2 修改对象程序 43
2.5.7.3 修改客户程序 50
2.6 为COM对象添加多接口支持 51
2.6.1 多接口 51
2.6.2 DEFINE_GUID 53
2.6.3 例程实现 53
2.6.3.1 修改接口文件 53
2.6.3.2 修改对象程序 55
2.6.3.3 修改客户程序 56
小结 57
第3章 COM基础知识 59
3.1 对象与接口 59
3.1.1 COM对象 60
3.1.2 COM接口 61
3.1.3 IUnknown接口 62
3.1.3.1 生存期控制:AddRef和Release 63
3.1.3.2 接口查询:QueryInterface 64
3.1.4 全球唯一标识符GUID 64
3.1.5 COM接口定义 65
3.1.6 接口描述语言IDL 67
3.2 COM应用模型 68
3.2.1 客户/服务器模型 69
3.2.2 进程内组件 70
3.2.3 进程外组件 70
3.2.4 COM库 72
3.2.5 HRESULT返回值 73
3.2.6 COM与注册表 75
3.3 COM组件 78
3.3.1 实现类厂对象 78
3.3.2 类厂对象的创建 80
3.3.3 实现自动注册 82
3.3.4 实现自动卸载 83
3.4 COM客户 84
3.4.1 COM对象创建函数 84
3.4.1.1 CoGetClassObject 84
3.4.1.2 CoCreateInstance 85
3.4.1.3 CoCreateInstanceEx 86
3.4.2 如何调用进程内组件 87
3.4.3 COM客户调用进程外组件 89
3.5 进一步认识COM 91
3.5.1 可重用机制:包容和聚合 91
3.5.2 进程透明性 93
3.5.3 安全性机制 94
小结 95
第4章 COM扩展技术 97
4.1 可连接对象机制 97
4.1.1 客户、接收器与可连接对象 98
4.1.1.1 接收器 98
4.1.1.2 可连接对象 98
4.1.1.3 客户 99
4.1.2 实现可连接对象 99
4.1.3 实现接收器 100
4.1.4 建立接收器与连接点的连接 101
4.1.5 获得出接口的类型信息 102
4.2 结构化存储 102
4.2.1 什么叫结构化存储和复合文件 103
4.2.2 存储对象和IStorage接口 104
4.2.2.1 IStorage接口 104
4.2.2.2 获得IStorage指针 105
4.2.2.3 释放STATSTG内存 105
4.2.2.4 枚举存储对象中的元素 106
4.2.3 流对象和IStream接口 106
4.2.4 结构化存储示例——例程StructStore 107
4.3 永久对象 113
4.3.1 永久接口 114
4.3.2 永久对象编程——例程PersistText 116
4.3.3 永久对象客户编程——例程PersistClient 120
4.4 命名与绑定技术 125
4.4.1 COM名字对象与IMoniker 126
4.4.2 COM系统名字对象 128
4.4.2.1 文件名字对象(file moniker) 128
4.4.2.2 复合名字对象(composite moniker) 128
4.4.2.3 单项名字对象(item moniker) 129
4.4.2.4 反-名字对象 130
4.4.2.5 指针名字对象 130
4.4.2.6 类名字对象 130
4.4.3 使用名字对象 131
4.4.3.1 获得名字对象 131
4.4.3.2 执行绑定操作 131
4.5 统一数据传输 132
4.5.1 数据交换与传输协议的分离 132
4.5.2 数据格式和传输介质 133
4.5.2.1 FORMATETC结构 133
4.5.2.2 STGMEDIUM结构 135
4.5.3 数据对象和IDataObject接口 137
4.5.4 MFC对统一数据传输的支持 138
4.5.4.1 COleDataSource类 138
4.5.4.2 COleDataObject 139
4.5.5 剪贴板传输——例程OleClip 140
4.5.6 OLE拖放——例程OleDragDrop 145
小结 148
第5章 COM技术的应用 149
5.1 基于COM的应用技术 150
5.1.1 COM、OLE与ActiveX 150
5.1.2 OLE文档 151
5.1.3 自动化 152
5.1.4 ActiveX控件 153
5.1.5 ActiveX文档 154
5.2 理解在企业应用中使用COM组件的技术 155
5.2.1 多层软件结构模型 156
5.2.2 多层软件应用中的COM组件类型 158
5.2.3 组件的安装和注册 159
5.3 在Visual C++中使用ActiveX控件——例程VCActiveX 160
5.3.1 创建ActiveX控件包容器程序 160
5.3.2 加载ActiveX控件 161
5.3.3 设计时访问控件的属性 164
5.3.4 运行时访问控件的属性和方法 166
5.3.5 处理控件的事件 167
5.4 在Visual C++中使用代码组件 168
5.4.1 利用OLE/COM Obiect Viewer查看组件信息 169
5.4.2 利用COM库函数使用代码组件——例程VCAuotCom 171
5.4.3 通过ClassWizard使用代码组件——例程VCAuotClw 174
5.4.4 利用#import指令使用代码组件——例程VCAutoImport 176
5.4.4.1 #import指令和智能指针 176
5.4.4.2 创建VCAutoImport例程 178
5.5 在Visual Basic中使用COM组件 180
5.5.1 使用ActiveX控件——例程VBActiveX 180
5.5.2 使用代码组件——例程VBAuto 184
5.6 在Web站点中使用COM组件 187
5.6.1 COM在多层Web应用程序中的重要作用 187
5.6.2 在客户端使用ActiveX控件 188
5.6.3 在服务器端使用代码组件 191
小结 193
第6章 用VC开发COM应用 195
6.1 VC对COM的支持 195
6.1.1 类库支持:MFC和ATL 196
6.1.2 比较MFC和ATL 196
6.2 MFC对COM开发的支持 197
6.2.1 MFC简介 198
6.2.2 MFC对自动化的支持 200
6.2.2.1 MFC AppWizard支持 200
6.2.2.2 CCmdTarget类支持 201
6.2.3 MFC对复合文档的支持 202
6.2.4 MFC对ActiveX控件的支持 203
6.3 使用MFC开发COM组件——例程MFCSample 204
6.3.1 创建一个进程内自动化组件工程 204
6.3.2 分析新建工程文件 205
6.3.3 添加COM对象类 207
6.3.4 为接口添加属性 207
6.3.5 为接口添加方法 209
6.3.6 创建并测试组件 210
6.4 探讨MFC实现COM的内幕 210
6.4.1 MFC COM对象的实现 210
6.4.2 MFC COM引出函数和类厂实现 216
6.5 ATL基础知识 219
6.5.1 ATL简介 219
6.5.2 模板和多继承 220
6.5.3 几个重要的类 222
6.5.3.1 CComModule 223
6.5.3.2 CComObjectRoot/CComObjectRootEx 223
6.5.3.3 CComCoClass 224
6.5.3.4 CComObject 224
6.6 使用ATL开发COM组件——例程ATLSample 224
6.6.1 创建一个新的ATL工程 224
6.6.2 分析工程文件 226
6.6.3 添加新的对象类 228
6.6.4 为接口添加属性 231
6.6.5 为接口添加方法 233
6.6.6 创建并测试组件 235
6.7 探讨ATL实现COM的内幕 235
6.7.1 ATL COM对象的实现 235
6.7.2 ATL COM引出函数和类厂实现 236
6.7.3 注册脚本文件(.RGS) 238
6.8 调试COM组件 239
6.8.1 调试COM组件DLL 239
6.8.2 调试COM组件EXE 239
小结 240
第7章 自动化 241
7.1 自动化技术基础 241
7.1.1 自动化:C++与VBA的桥梁 241
7.1.2 自动化组件与自动化客户 242
7.1.3 IDispatch接口 243
7.1.3.1 GetTypeInfoCount和GetTypeInfo 244
7.1.3.2 GetIDsOfNames 244
7.1.3.3 Invoke 244
7.1.4 类型库和ODL 245
7.1.5 VARIANT数据类型 247
7.2 用MFC开发自动化组件——例程MFCSampleExe 249
7.2.1 创建最小的MFC自动化EXE工程 249
7.2.2 添加COM对象类、接口、属性和方法 251
7.2.3 在Excel中测试组件 252
7.3 用ATL开发自动化组件——例程ATLSampleExe 254
7.3.1 利用ATL COM AppWizard创建进程外组件 254
7.3.2 分析ATL进程外组件与进程内组件的差别 255
7.3.2.1 文件生成差别 255
7.3.2.2 StdAfx.h文件差别 255
7.3.2.3 ATLSampleExe.cpp文件差别 256
7.3.3 增加COM对象类、属性和方法 257
7.3.4 测试ATL SanpleExe.Account中测试组件 258
7.4 位于业务逻辑层的代码组件 258
7.4.1 ADO对象模型和基本编程模型 258
7.4.2 在Visual C++中使用ADO 260
7.4.2.1 使用#import指令 261
7.4.2.2 利用ClassWizard加载ADO对象类 263
7.4.2.3 通过COM API使用ADO 264
7.4.3 创建使用ADO的代码组件——例程ADOSamp 265
7.4.4 创建数据源 269
7.4.5 编写客户程序 272
7.4.6 三层软件应用模型 275
小结 275
第8章 OLE文档与ActiveX文档 277
8.1 OLE文档基础知识 277
8.1.1 OLE文档服务器与包容器 278
8.1.2 OLE服务体系结构 280
8.1.3 链接与嵌入技术 282
8.1.4 现场激活技术 285
8.1.5 MFC对OLE文档的支持 287
8.2 创建现场激活OLE服务器——例程ScribbleOle 289
8.2.1 预览ScribbleOle程序 289
8.2.2 利用AppWizard创建OLE服务器工程 291
8.2.3 将OLE相关文件添进Scribble工程 292
8.2.4 使ScribbleOle真正具有OLE服务器特性 293
8.2.5 编辑OLE相关资源 296
8.2.6 为文档类添加程序特定的服务器支持 298
8.2.7 实现服务器对象 300
8.2.8 在视图类中实现现场支持 301
8.2.9 创建并测试OLE服务器 303
8.3 创建OLE包容器——例程Container 303
8.3.1 创建新的OLE包容器工程并测试 303
8.3.2 分析工程代码 304
8.3.2.1 CContainerApp 304
8.3.2.2 CContainerView 305
8.3.2.3 CContainerCntrItem 307
8.3.3 实现客户对象矩形 308
8.3.4 实现鼠标点击激活 309
8.3.5 实现对象的移动和改变大小 311
8.3.6 绘制多个嵌入对象 312
8.3.7 实现嵌入对象的删除 313
8.3.8 创建并测试Container程序 313
8.4 ActiveX文档——例程ScribbleActiveX 314
8.4.1 比较ActiveX文档与OLE文档(用户角度) 314
8.4.2 比较ActiveX文档与OLE文档(开发者角度) 315
8.4.3 开发ActiveX文档服务器 316
8.4.4 将OLE文档转换服务器改造为ActiveX文档服务器 317
8.4.5 在IE中测试ScribbleActiveX 318
8.4.6 ActiveX文档包容器程序的实现 319
小结 321
第9章 ActiveX控件 323
9.1 ActiveX控件基础知识 323
9.1.1 ActiveX控件的发展历史 323
9.1.2 ActiveX控件基本要求 325
9.1.3 库存属性、方法和事件 326
9.1.4 ActiveX控件与包容器的通信 327
9.1.4.1 IOleControl接口 328
9.1.4.2 IOleControlSite接口 328
9.1.5 属性页技术 330
9.2 Visual C++对ActiveX控件的支持 331
9.2.1 MFC对ActiveX控件的封装 331
9.2.2 ATL对ActiveX控件的封装 332
9.2.2.1 CcomControl类 332
9.2.2.2 CComControlBase 333
9.2.2.3 CWindowImpl和CWindowImplBase 333
9.2.3 ActiveX Control Test Container 333
9.3 用MFC开发ActiveX控件——例程MfcCircCtrl 333
9.3.1 使用MFC ActiveX ControlWizard创建控件框架 333
9.3.2 修改控件位图 336
9.3.3 添加库存属性 338
9.3.4 添加自定义属性 341
9.3.5 添加事件 345
9.3.6 实现属性表 348
9.4 用MFC编写聚合控件——例程TimeSheet 350
9.4.1 预览控件运行效果 350
9.4.2 添加MFC ActiveX Form ClassWizard AppWizard 350
9.4.3 创建timesheet控件并添加MSFlexGird控件 351
9.4.4 编辑timesheet控件的单元格 356
9.4.5 创建并测试timesheet控件 358
9.5 用ATL开发ActiveX控件——例程AtlTickerCtrl 359
9.5.1 预览控件效果 359
9.5.2 创建工程框架添加控件对象 360
9.5.3 分析代码并测试新控件 362
9.5.4 实现滚动显示 363
9.5.5 提供修改滚动速度的接口 365
9.5.6 获取股价信息 366
9.5.7 绘制控件 367
9.5.8 响应环境属性的变化 369
9.5.9 增加事件 370
9.5.10 为库存属性设置缺省值 372
9.5.11 实现属性表 373
小结 376
第10章 Internet COM组件 377
10.1 ActiveX控件与Internet 377
10.1.1 Internet对ActiveX控件提出的新要求 377
10.1.2 ActiveX控件的安全设置 379
10.1.2.1 设置初始化安全性 379
10.1.2.2 设置脚本安全性 380
10.1.2.3 安全标志的局限性 380
10.1.3 设置ActiveX控件的安全级别 381
10.1.3.1 修改注册表 381
10.1.3.2 使用IObjectSafety 382
10.1.4 ActiveX控件的数字签名 383
10.1.5 Active控件的使用许可 384
10.1.6 包装AcitveX控件 385
10.2 改造Ticker控件——例程IETickerCtrl 388
10.2.1 ATL轻型控件 388
10.2.2 标记控件为初始化/脚本安全 389
10.2.3 持续属性 391
10.3 在ActiveX控件中访问DOM对象 393
10.3.1 什么是DOM(文档对象模型) 393
10.3.2 在ActiveX控件中访问DoM——例程DOMSamp 395
10.3.3 测试DOMCtrl控件 398
10.4 活动服务器组件 399
10.4.1 活动服务器页面(ASP) 399
10.4.2 ASP内建对象 400
10.4.2.1 Application对象 400
10.4.2.2 Session对象 401
10.4.2.3 Request对象 401
10.4.2.4 Response对象 401
10.4.2.5 Server对象 401
10.4.2.6 ObjectContext对象 401
10.4.3 创建活动服务器组件——例程ASPComSamp 401
10.4.4 在ASP中测试ASPComp组件 406
小结 407
第11章 从COM到COM+:DcoM、MTS 409
11.1 从COM到COM+ 410
11.2 分布式COM(DCOM) 411
11.2.1 什么是DCOM 412
11.2.2 DCOM特性 412
11.2.3 DCOM的基本结构 413
11.2.4 列集(marshaling) 415
11.2.5 RPC(远过程调用) 415
11.2.6 DCOM对象的定位与远程激活 416
11.2.6.1 用DCOM配置工具指定远程服务器名 416
11.2.6.2 在客户代码中指定远程服务器名 417
11.2.7 远程创建DLL组件:代理进程(surrogate) 418
11.2.8 IUnknown优化 418
11.2.9 DCOM安全机制 419
11.3 DCOM组件的开发与部署 420
11.3.1 基于NT服务的DCOM服务器——例程DCOMServ 420
11.3.2 测试服务程序 422
11.3.3 DCOMCNFG实用程序 424
11.3.3.1 缺省属性 425
11.3.3.2 缺省安全性 426
11.3.3.3 缺省协议 426
11.3.3.4 应用程序特定设置 427
11.4 微软事务服务器(MTS) 428
11.4.1 MTS概述 428
11.4.1.1 MTS运行时环境 429
11.4.1.2 MTS Explorer 429
11.4.1.3 MTS APIs 429
11.4.2 MTS应用基本结构 430
11.4.2.1 应用组件 430
11.4.2.2 资源管理器 431
11.4.2.3 资源分发器 431
11.4.2.4 Microsoft DTC 431
11.4.3 MTS对象与环境对象 431
11.4.3.1 MTS对象的环境对象 432
11.4.3.2 创建MTS对象 433
11.4.3.3 事务环境对象 434
11.4.4 MTS客户 434
11.4.5 事务(Transaction) 434
11.4.6 即时激活(just-in-time activation) 436
11.4.7 安全性控制 437
11.4.7.1 基本的安全性函数 437
11.4.7.2 高级安全性方法 438
11.5 MTS组件的开发与管理 438
11.5.1 MTS组件的要求 439
11.5.2 创建一个简单的COM组件——例程MTSServ 439
11.5.3 MTS Explorer 440
11.5.4 将Account组件添加到MTS环境中 442
11.5.5 运行并监控Account组件 443
11.6 微软消息队列(MSMQ) 444
11.6.1 何谓MSMQ 445
11.6.2 MSMQ的好处 445
11.6.3 MSMQ组件 446
11.6.3.1 队列 446
11.6.3.2 消息 446
11.6.4 MSMQ对象模型 446
11.6.5 消息发送 447
11.6.5.1 生成MSMOQueueInfo对象 447
11.6.5.2 设置去队列的路径 448
11.6.5.3 生成和打开队列 448
11.6.5.4 生成MSMQMessage对象 448
11.6.5.5 填入消息内容 448
11.6.5.6 发送消息 449
11.6.5.7 关闭队列 449
11.6.6 消息接收 449
11.6.7 MSMQ事件 450
11.6.7.1 生成消息事件对象 450
11.6.7.2 设置事件 450
11.6.7.3 生成事件处理器 451
小结 451
第12章 COM+服务 453
12.1 COM+概述 453
12.1.1 Windows DNA策略 454
12.1.2 COM+基本结构 455
12.1.3 COM+程序管理工具 456
12.2 COM+系统结构 457
12.2.1 COM+组件 458
12.2.2 COM+目录 458
12.2.3 COM+环境 461
12.3 COM+对MTS服务的增强 463
12.3.1 事务特性 463
12.3.2 安全性 464
12.3.3 同步服务 466
12.3.4 COM+对象池 467
12.4 COM+新增系统服务 468
12.4.1 COM+队列组件 469
12.4.2 COM+事件模型 471
12.4.3 负载平衡 473
12.3.4 内存数据库 474
小结 476
第13章 COM+应用开发 477
13.1 最简单的COM+组件——例程Stepl 477
13.1.1 创建一个最简单的COM+组件 477
13.1.2 创建一个空的COM+应用程序 478
13.1.3 将Account组件安装到COM+应用程序中 480
13.1.4 运行和监控Account组件 482
13.2 使用ODBC资源分发器——例程Step2 483
13.2.1 创建数据源 483
13.2.2 修改Step1程序 483
13.2.3 重新安装并测试组件 487
13.3 创建规模可变的组件——例程Step3 488
13.3.1 即时激活特性 489
13.3.2 修改Step2程序 489
13.3.3 重新安装并测试组件 490
13.4 创建事务性组件——例程Step4 490
13.4.1 修改Step3程序并重新安装组件 491
13.4.2 为组件设置事务属性 493
13.4.3 监控事务操作 494
13.5 利用共享属性管理器共享状态——例程Step5 496
13.5.1 共享属性管理器 496
13.5.2 修改Step4程序 497
13.5.3 测试组件 500
13.6 使用多事务处理——例程Step6 501
13.6.1 修改Step5程序 501
13.6.2 测试组件 505
13.7 使用基于角色的安全性——例程Step7 506
13.7.1 修改Step6程序并测试 506
13.7.2 添加或删除角色 507
13.7.3 给角色分配用户帐户或组 507
13.7.4 重新测试组件 508
小结 509