译者序 1
前言 1
第1章 COM+介绍 1
1.1 组件的革命 1
1.1.1 两个目标 1
1.1.2 单一的大模块与组件模型的比较 2
1.2 COM的产生 3
1.3 什么是COM 4
1.4 组件对象 6
1.5 服务器程序和客户端程序 6
1.6 COM怎样工作:接口和虚函数表 7
1.6.1 接口 7
1.6.2 vtable(虚函数表) 10
1.7 IUnknown 11
1.9 全局惟一标识 13
1.8 接口定义语言和类型库 13
1.10 COM API 14
第2章 COM基础:创建一个简单的组件和客户端程序 15
2.1 创建步骤 15
2.2 传统的Stopwatch实现 16
2.2.1 最初的Stopwatch的设计 16
2.2.2 建立Timers.dll库 17
2.3 创建StopwatchClient.exe 24
2.5 添加IUnknown 27
2.4 回顾一下起点 27
2.5.1 实现IUnknown的两种方法 28
2.5.2 IUnknown必须被完全实现 29
2.5.3 添加IUnknown 29
2.6 实现Querylnterface() 30
2.6.1 Querylnterface()规则 31
2.6.2 生成GUID 32
2.6.3 添加Querylnterface() 34
2.6.4 调用Querylnterface() 35
2.7 引用计数 36
2.7.1 实现引用计数 37
2.7.2 使用COM引用计数 38
2.8 构建一个类工厂 42
2.9 使用COM API 51
2.9.1 注册服务器程序 51
2.9.2 初始化和取消初始化COM 52
2.9.3 用CoCreateInstance()实例化组件对象 52
2.10 回顾一下COM组件的关键元素 55
第3章 ATL介绍 56
3.1 使用ATL应用程序向导创建COM服务器程序 56
3.1.1 运行ATL应用程序向导 57
3.1.2 完成向导 60
3.2 添加COM对象 63
3.2.1 线程模式 64
3.2.2 接口 67
3.2.4 支持ISupportErrorInfo 68
3.2.3 聚合 68
3.2.5 支持连接点 69
3.2.6 结束向导 70
3.3 增加Stopwatch的方法和属性 72
3.3.1 声明方法和属性 72
3.3.2 添加计时代码 74
3.3.3 注册组件 77
3.4 通过客户端程序访问Stopwatch组件 78
第4章 接口定义语言介绍 81
4.1 从MIDL编译器输出 81
4.2 IDL基础 81
4.3 接口 83
4.3.1 接口标题属性 83
4.3.2 接口声明 85
4.4 C++接口定义 86
4.5 方法 89
4.6 参数 92
4.7 属性 94
4.7.1 属性的标志 95
4.7.2 读写属性 95
4.7.3 属性的附加参数 96
4.8 定义类型库 97
4.9 向Stopwatch添加Overhead属性 99
第5章 COM的客户端程序及智能指针的使用 107
5.1 客户端程序概述 107
5.2 初始化和取消初始化COM子系统 107
5.3 实例化COM对象 109
5.4 将COM服务器程序定义导出到客户端程序 111
5.5 智能指针 114
5.6 _com_ptr_t模板类 114
5.7 新类型的IStopwatch 118
5.8 使用异常处理错误 121
5.9 混合使用智能指针与原始接口 123
5.10 跨COM边界传递接口 124
5.11 另一COM客户端程序示例 127
第6章 处理通称为BSTR的COM字符串 133
6.1 COM字符串基础 133
6.1.1 Unicode与ANSI数据类型 133
6.1.2 OLECHAR、LPOLESTR和LPCOLESTR 134
6.1.3 处理LPOLESTR 134
6.1.4 是否执行Unicode编译 135
6.1.5 TCHAR 135
6.1.6 使用BSTR处理不同大小的字符串 136
6.1.7 处理BSTR的常用API函数 137
6.1.8 跨COM边界的字符串内存管理 138
6.1.9 字符串转换函数 143
6.2 CComBSTR 145
6.3 _bstr_t 149
6.4 选择字符串封装器 154
7.1 有效的COM数据类型 156
第7章 其他COM数据类型 156
7.2 使用VARIANT_BOOL的Boolean值 157
7.3 变量数据类型 158
7.3.1 VARIANT结构 159
7.3.2 常用变量处理API函数 161
7.3.3 CComVariant 164
7.3.4 _variant_t 166
7.4 枚举 169
7.5 可选参数 170
7.6 指定默认值 171
7.7 传递数组 172
7.8 传递数目可变的自变量 174
7.9 传递COM对象 174
第8章 浏览IDispatch 176
8.1 创建支持双重接口的Stopwatch组件 176
8.1.1 在IDL中声明双重接口 177
8.1.2 接口继承和IDispatch 182
8.1.3 在组件内实现IDispatch 183
8.1.4 更新COM映射 183
8.2 更改组件的版本 184
8.2.1 更新文件版本 185
8.2.2 更新注册表中的新CLSID和类型库版本 186
8.3 测试IDispatch接口 187
8.4 在C++COM客户程序中调用IDispatch接口 188
9.1 HRESLUT结构 198
第9章 错误处理和组件调试 198
9.2 使用定制HRESULT进行错误处理 199
9.3 详细错误处理 202
9.3.1 IErrorlnfo接口 202
9.3.2 ISupportErrorInfo接口 202
9.3.3 在Stopwatch项目中添加ISupportErrorInfo 203
9.3.4 在客户程序中使用详细错误处理 210
9.3.5 _com_error 211
9.4 调试ATL代码 211
9.4.1 编写调试窗口的消息 212
9.4.2 使用ATLASSERT()验证一切正常 213
9.4.3 调试QueryInterface()和引用计数 213
9.5 在调试器中运行客户程序和服务器程序 214
第10章 事件 215
10.1 事件概述 215
10.2 连接点 217
10.3 创建支持事件的COM服务器程序 220
10.3.1 接口设计 220
10.3.2 添加倒计时组件并定义它的接口 223
10.3.3 实现ICountdown接口 229
10.3.4 实现连接点和激发事件 233
10.3.5 实现IProvideClassInfo2 238
10.4 接收组件的事件通知 239
10.4.1 创建ATL可执行文件 240
10.4.3 声明源接口实现 246
10.4.2 添加对话框 246
10.4.4 连接连接点 251
10.4.5 引用计数和连接点 254
10.4.6 使用内嵌监听器类避免循环引用计数 256
10.4.7 IDispEventImpl和IDispEventSimpleImpl 264
第11章 ActiveX 265
11.1 ActiveX控件 265
11.2 开发一个ActiveX控件 265
11.2.1 创建一个空的ATL项目 266
11.2.2 添加一个控件模板 266
11.2.3 StopwatchControl对象 269
11.2.4 编译、调试Stopwatch控件 278
11.2.5 为默认控件添加功能 281
11.2.6 添加一个按钮 286
11.2.7 添加一个定制属性页 289
11.2.8 持续性和属性包 296
12.1 为所有应用程序配置DCOM默认设置 298
第12章 DCOM 298
12.1.1 Default Properties 300
12.1.2 Default Security 302
12.1.3 Default Protocols 303
12.2 为DCOM配置一个特定的应用程序 303
12.2.1 配置客户端程序计算机 303
12.2.2 配置服务器程序计算机 305
12.3 使用DCOM编程 307
12.2.3 运行客户端程序 307
12.3.1 CoCreateInstanceEx() 308
12.3.2 一个DCOM客户端程序示例 310
12.4 查找DCOM故障 315
12.5 COM安全API函数 317
12.5.1 使用CoInitializeSecurity()配置安全许可 317
12.5.2 扮演客户端程序的身份:CoImpersonateClient() 319
12.5.3 用CoQueryClientBlanket()确定安全设置 319
12.6.1 代理服务器和存根 320
12.6 调度 320
12.6.2 定制调度 322
12.6.3 类型库调度 322
12.6.4 MIDL生成的代理服务器/存根 322
12.7 DCOM小结 323
第13章 线程 324
13.1 线程模型摸拟 325
13.1.1 单一线程模型 325
13.1.2 公寓线程模型 327
13.1.3 自由线程模型 329
13.1.4 双线程模型 331
13.1.5 线程中立模型 332
13.1.6 自由线程化调度器 334
13.2 跨公寓调度 336
13.2.1 拦截者-代理服务器和存根 336
13.2.2 使用工作者线程 338
13.3 与ATL同步 341
13.4 异步COM调用 345
13.4.1 在组件服务器程序中定义异步接口 346
13.4.2 异步地调用 348
13.4.3 异步方法完成通知 351
13.4.4 实现异步COM服务器程序 352
第14章 COM+的发展过程 354
14.1 为什么要用COM+ 354
14.2 COM+服务和术语介绍 355
14.2.1 组件服务 355
14.2.2 COM+服务 356
14.2.3 配置组件 357
14.3 COM+如何工作概述 358
14.3.1 对象上下文细述 359
14.3.2 并发和活动 360
14.4 COM+事务 361
14.4.2 调用事务支持 362
14.4.1 数据一致性 362
14.4.3 事务流 363
14.4.4 资源管理器和资源分发器 365
14.4.5 补偿资源管理器 367
14.5 用排队组件编写分离应用程序 368
14.6 发布和预定事件服务 369
14.7 控制对象生存期来增加可升级性能 370
14.7.1 对象缓冲 370
14.7.2 即时激活 371
14.7.3 IObjectControl接口 372
14.8 共享属性管理器 372
14.9 基于角色的安全 373
14.10 准备就绪 374
第15章 建立COM+系统 375
15.1 示例程序 375
15.2 创建一个可持续的组件 377
15.3 建立HotelReservation.exe客户端应用程序 382
15.4.1 COM+应用程序的两种类型 386
15.4 COM+应用程序 386
15.4.2 创建一个COM+应用程序 387
15.4.3 配置一个COM+应用程序 390
15.5 利用COM+事件服务 394
15.5.1 创建事件类 394
15.5.2 把组件添加到Component Services 396
15.5.3 在Component Services中配置事件类 398
15.5.4 创建一个事件预定者 399
15.5.5 在Component Services中配置预定者 401
15.5.6 为预定者发布事件 404
15.6 排队组件 405
15.6.1 创建一个可队列化组件 405
15.6.2 把组件配置为排队组件 408
15.6.3 实例化并调用排队组件 410
15.6.4 使用队列事件的分离、异步预定者 413
15.7 COM+事务 414
15.7.1 创建一个支持事务的组件 415
15.7.2 使用ObjectContext参加事务 419
15.7.3 为事务支持配置组件 421
15.7.4 通过编程在事务中包含可执行程序 426
15.8 配置组件激活 428
15.8.1 对象缓冲 429
15.8.2 即时激活 432
15.8.3 利用组件内部的构造字符串 433
15.9 基于角色的安全 435
15.8.4 其他的Activation设置 435
15.10 调试服务器程序组件 438
15.10.1 调试配置为库应用程序的服务器程序组件 438
15.10.2 配置为服务器应用程序/从Active Workspace调试 438
15.11 部署应用程序 439
15.11.1 应用程序代理服务器 440
15.11.2 服务器应用程序 441
15.12 使用ATL COM AppWizard建立一个MTS兼容的应用程序 441
15.13 最后的想法 448