译者序 1
前言 1
第一部分 Visual C++5.0环境 1
第1章 Visual C++环境 1
1.1 开发平台 1
1.1.1 观察窗口 2
1.1.2 工具条 3
1.2 项目工作区 3
1.3 工作区窗口 4
1.3.1 FileView 4
第二部分 通用MFC编程 5
1.3.2 ClassView 5
1.4 项目配置 6
1.5 转换旧的项目 7
1.6 同时进行多个项目 8
1.7.1 资源浏览 9
1.7 资源管理 9
1.7.2 导入资源 10
1.7.3 管理资源ID 10
1.7.4 资源模板 11
1.8 编辑资源 12
1.8.1 对话框 12
1.8.2 编辑菜单 14
1.8.3 其他资源 15
1.9 应用程序向导 15
1.9.1 AppWizard的作用 15
1.9.2 启动AppWizard 16
1.9.3 项目类型 16
1.10 ClassWizard 17
1.10.1 消息映射 17
1.10.2 成员变量 17
1.10.3 自动化 18
1.10.4 ActiveX事件 18
1.10.6 增中一个类 19
1.10.5 类信息 19
1.11 组件廊 20
1.12 集成调试器 21
1.12.1 观察数据 21
1.12.2 出现异常后的调试 21
1.13 命令行工具 22
1.1.4 其他工具 22
1.14.1 Spy++ 22
1.14.2 MFC Tracer 22
1.14.3 Rengister Control 22
1.14.4 ActiveX Control TestContainer 22
1.14.5 OLE/COM Object Viewer 22
1.15 小结 23
1.14.7 WinDiff 23
1.14.8 Help Workshop 23
1.14.6 Error Lookup 23
第2章 MFC概览 25
2.1 应用程序框架 25
2.2 用AppWizard创建MFC应用程序 25
2.2.1 启动AppWizard 25
2.2.2 了解你的应用程序 30
2.2.3 AppWizard创建的类 30
2.2.4 CDorument,Cview及 Frame类 31
2.3 CwinApp类 31
2.4 CwinThread类 32
2.5 CcrndTarget类 32
2.6 Cobject类 32
2.7 运行时类型信息 35
2.8 调试支持 36
2.8.1 AssertValid() 36
2.8.2 ASSERT宏 37
2.8.3 Dump() 37
2.8.4 TRACE()宏 38
2.9 完整的应用程序 39
2.9.1 WinMain() 39
2.9.2 InitApplication()和InitInstance() 39
2.9.3 LoadStdProfileSettings() 41
2.9.4 用命令行工作 41
2.9.5 创建主窗口 42
2.10 消息循环 42
2.11 小结 42
3.2 MFC中的消息处理 43
3.1 消息的种类 43
第3章 MFC消息和命令 43
3.3 消息发送 44
3.4 用ClassWizard进行消息处理 45
3.5 创建消息映射 46
3.5.1 填充消息映射 47
3.5.2 消息映射的内部 49
3.5.3 实现处理函数 49
3.5.4 PreTranslateMessage() 50
3.6 小结 50
第4章 框架、文档和视 51
4.1 文档/视体系 51
4.1.1 单文档与多文档应用程序 51
4.1.2 文档类 51
4.2.1 创建文档类 52
4.2 创建应用程序 52
4.1.5 文档模板 52
4.1.3 视类 52
4.1.4 框架 52
4.2.2 文档数据 53
4.2.3 Serialize() 54
4.2.4 OnNewDocurnent() 54
4.2.5 DeleteContents() 55
4.2.6 OnOpenDocument() 55
4.2.7 OnSaveDocument() 56
4.2.8 OnCloseDocument() 56
4.2.9 ReportSaveLoadException() 56
4.2.10 “脏”标志 56
4.2.11 访问文档 56
4.4 视类 57
4.4.1 CscrollView类 57
4.3 视 57
4.4.2 CForm View 和CRecordView类 58
4.4.3 控件视 58
4.4.4 CEditView 59
4.4.5 使用CrichEditView 60
4.4.6 ClistView 和CTreeView 60
4.5 文档模板 61
4.5.1 为文档创建另一个视 62
4.5.2 CDocument::OnChangeViewList() 62
4.5.3 UpdateAllViews() 62
4.5.4 从文档访问视 63
4.6 处理框架 63
4.6.1 状态条 63
4.6.2 增加一个工具条 65
4.6.3 浮动式和固定式工具条 66
4.7.1 更新用户界面 67
4.7.2 弹出式菜单 67
4.7 再谈菜单 67
4.7.3 动态创建菜单 68
4.8 在应用程序中加入分割线 69
4.8.1 动态分割线 69
4.8.2 创建不同的视 70
4.8.3 静态分割线 70
4.9 在应用程序中加入拖放功能 71
4.9.1 使拖放有效 71
4.9.2 处理WM_DROPFILES消息 71
4.10 小结 72
第5章 对话框和控件 73
5.1 使用自己的对话框 73
5.1.1 构造对话框对象 73
5.1.3 无模式对话框 74
5.1.2 显示对话框 74
5.2 用ClassWizard创建对话框类 75
5.3 在对话框中使用控件 77
5.4 Windows控件类 78
5.4.1 CEdit 78
5.4.2 静态控件 79
5.4.3 按钮控件 80
5.4.4 列表框控件 81
5.4.5 组合框 82
5.5 对话框数据交换 83
5.5.1 创建自己的DDX函数 83
5.5.2 数据有效化 84
5.6 Windows通用对话框 85
5.6.1 CFileDialog 85
5.6.2 CPrintDialog 85
5.6.5 CFontDialog 86
5.6.4 CColorDialog 86
5.6.3 CPageSetupDialog 86
5.6.6 CFindAndReplace 87
5.6.7 OLE通用对话框 88
5.7 创建属性表 88
5.7.1 建立属性页 89
5.7.2 创建属性表 89
5.7.3 用属性表进行对话框数据交换 90
5.7.4 加入应用按钮 90
5.7.5 创建自己的向导 91
5.8 对话条 92
5.9 小结 92
第6章 用MFC进行绘图和打印 93
6.1 绘制窗口 93
6.2 CDC类 93
6.2.1 GDI封装的类 93
6.2.2 映像模式 94
6.2.3 使用GDI对象 95
6.2.4 用CDC绘图 99
6.2.5 其他热门绘图话题 100
6.3 打印 101
6.3.1 打印过程 101
6.3.2 打印循环 102
6.4 打印预览 103
6.5 小结 103
第7章 通用类 104
7.1 Csbring 104
7.1.1 CString和C字符串 104
7.1.2 CString和Unicode 105
7.1.3 CString的内存分配问题 105
7.1.4 创建CString对象 105
7.1.7 比较CString的值 106
7.1.6 处理单个的字符 106
7.1.5 CString表达式 106
7.1.8 格式化CString 107
7.1.9 其他CString函数 107
7.1.10 什么时候不用CString类 108
7.2 CTime类和CTimeSpan类 108
7.2.1 构造Ctime对象 108
7.2.2 CTime和时区 108
7.2.3 GetCurrentTime() 109
7.2.4 格式化时间 109
7.2.5 提取时间值 110
7.2.6 CTime运算 110
7.2.7 CTimeSpan类 110
7.3 ColeDateTime和COLeDateTimeSpan 110
7.4 MFC的文件类 111
7.4.1 打开文件 111
7.4.6 CMemFile类 112
7.4.5 关闭文件 112
7.4.2 使用CFile类进行读写 112
7.4.4 得到有关文件的信息 112
7.4.3 使用CstdioFile类进行读写 112
7.4.7 CsharedFile类 113
7.5 CArchive类 113
7.6 MFC的集合类 113
7.6.1 MFC非模板集合类 113
7.6.2 MFC的模板集合类 114
7.6.3 声明简单集合类 114
7.6.4 使用数组 115
7.6.5 模板基集合类的帮助函数 115
7.6.6 使用Clist类 118
7.6.7 使用映像类 119
7.7 异常处理 119
7.7.1 用C++进行异常处理 120
7.7.2 发出异常 121
7.8 MFC异常类 121
7.8.1 CMemoryException 122
7.8.2 CNotSupportedException 122
7.8.3 CFileException 122
7.8.4 CArchiveException 123
7.8.5 CResourceException 124
7.8.6 COleException 124
7.8.7 CUserException 124
7.8.8 CDBException 124
7.8.9 CDaoException 124
7.8.10 CInternetException 125
7.9 Win32系统级异常 125
7.10 小结 126
8.1.1 Win32内存地址空间 127
8.1 Win32内存模式 127
第8章 内存管理 127
8.1.2 Win32保留地址 128
8.1.3 16位与32位的区别 128
8.2 简单内存分配 129
8.2.1 栈结构分配 130
8.2.2 堆内分配 130
8.2.3 GlobalMemoryStatus() 132
8.3 虚拟内存 132
8.4 共享内存 133
8.5 小结 135
第9章 用MFC进行多线程编程 137
9.1 在应用程序中使用多线程 137
9.1.1 MFC对象和线程 137
9.1.2 线程的类型 137
9.2.1 开始线程 138
9.2 使用工作线程 138
9.2.3 访问线程的返回码 139
9.2.2 编写线程函数 139
9.3 用户界面线程 140
9.3.1 创建线程 140
9.3.2 创建线程类 140
9.3.3 在线程中处理消息 141
9.3.4 中止线程 142
9.3.5 线程局部存储区 142
9.4 线程同步 143
9.4.1 潜在的错误 143
9.4.2 发送事件 146
9.5 创建一个新进程 148
9.6 小结 149
10.1.1 输入库 150
10.1.2 调用约定 150
10.1 使用动态链接库 150
第10章 动态链接库 150
10.1.3 加载DLL 151
10.1.4 动态加载DLL 152
10.2 创建自己的DLL 153
10.2.1 从DLL中输出函数 154
10.2.2 DLL内存 155
10.2.3 建立DLL 156
10.3 DLL和MFC 156
10.3.1 普通型MFC DLL 156
10.3.2 扩展MFC DLL 157
10.3.3 调试DLL 158
10.3.4 Dumpbin.exe 158
10.4 小结 159
11.1 OLE历史的简要回顾 161
第11章 ActiveX概览 161
第三部分 ActiveX编程 161
11.2 最终用户对OLE的见解 163
11.3 程序开发人员对OLE的看法 167
11.3.1 组件对象模型 168
11.3.2 结构化存储 169
11.3.3 Monikers 171
11.3.4 统一数据传输 172
11.3.5 OLE文档 173
11.3.6 OLE自动化 174
11.3.7 OLE控件 175
11.4 OLE技术扩展到ActiveX 176
11.4.1 ActiveX文档 176
11.4.2 ActiveX控件 176
11.4.3 COM 177
11.5.1 ActiveX超级链接 178
11.5.2 ActiveX协议 178
11.4.4 Internet Monikers 178
11.5 ActiveX 技术 178
11.5.3 ActiveX服务器扩展 179
11.5.4 ActiveX Script 179
11.5.5 代码签名 179
11.5.6 HTML扩展 179
11.5.7 ActiveMovie 179
11.6 小结 179
第12章 ActiveX文档 180
12.1 什么是ActiveX文档 180
12.2 MFC有些什么新内容 181
12.3 有关ActiveX文档的一些细节 181
12.4 COM接口 184
12.4.1 IOleObject 184
12.4.2 IDataObject 185
12.4.3 IPetsistStorage 186
12.4.4 IPersistFile 187
12.4.5 IOleDocumment 187
12.4.6 IOleInPlaceObjcet 187
12.4.7 IOleInPlaceActiveObject 188
12.4.8 IOleDocumentView 189
12.4.9 Iprint 189
12.4.10 IOleCommandTarget 190
12.5 Active模板库(ATL) 190
12.6 ACTIVEDOC程序 193
12.6.1 activect1.h 195
12.6.2 oledocument.h 200
12.6.3 activedoc.htm 204
12.7 小结 205
13.1 ActiveX容器 206
第13章 ActiveX容器 206
13.2 MFC中新加入了些什么 207
13.3 关于ActiveX容器的细节 207
13.3.1 结构化存储 208
13.3.2 Monikers 208
13.3.3 统一数据传输 209
13.3.4 嵌入式对象 209
13.3.5 链接式对象 209
13.3.6 拖放 209
13.3.7 在位激活 209
13.3.8 ActiveX文档 210
13.4 COM接口 210
13.4.1 IOleInPlaceFrame 211
13.4.3 IOle InPlaceUIWindow 212
13.4.4 IOle Container 212
13.4.2 IOle CommandTarget 212
13.4.5 IOle ClientSite 213
13.4.6 IAdiviseSivk 213
13.4.7 IOle DocumentSite 214
13.4.8 IOle InPlaceSite 214
13.4.9 IContinueCallback 215
13.5.1 XContainer程序 216
13.5.2 生成XContainer 216
13.5.3 回顾代码 220
13.5.4 加入新的接口 221
13.6 小结 229
第14章 ActiveX服务器 230
14.1 ActiveX服务器 230
14.2 用服务器组件进行三层开发 231
14.4.1 AppWizard的操作步骤 232
14.4 设计一个MFC小型服务器 232
14.3 MFC对ActiveX模板库 232
14.4.2 详细了解GLServer类 234
14.4.3 在激活过程中合并容器和服务器的菜单 243
14.4.4 测试GLServer框架 243
14.4.5 往GLServer框架中添加定制部分 244
14.4.6 测试GLServer的例子 256
14.5 设计MFC自动化服务器 257
14.5.1 使用AppWizard 257
14.5.2 细看MFCAuto类 257
14.5.3 在MFCAuto样例框架程序中加入自己的代码 258
14.5.4 测试MFCAuto例子 261
14.6 使用ActiveX模板库来设计自动化服务器 263
14.6.1 使用ATL COM AppWizard 263
14.6.2 定制ATLAuto例子 264
14.6.3 测试ATLAuto例子 267
14.7 小结 268
第15章 ActiveX控件 269
15.1 简要回顾 269
15.2 什么是ActiveX/OLE控件 271
15.3 ActiveX/OLE控件结构体系 272
15.3.1 属性 272
15.3.2 事件 276
15.3.3 方法 278
15.4 OLE控件接口 280
15.5 ActiveX控件 282
15.5.1 支持IUnknown接口 282
15.5.2 ActiveX必须自注册 284
15.5.3 组件类型 288
15.5.4 组件类型以及互操作性 290
15.5.5 代码签名 290
15.5.6 性能考虑 292
15.6 重用代码 295
15.6.1 Visual C++ ActiveX控件 296
15.6.2 Internet Explorer库存控件 296
15.7 测试ActiveX/OLE控件 297
15.7.1 在网页上显示控件 297
15.7.2 ActiveX Control Pad 301
15.7.3 ActiveX/OLE控件测试容器 302
15.7.4 开发工具中的ActiveX/OLE控件 302
15.8 创建ActiveX/OLE控件的方法 303
15.9 ActiveX模板库(ATL) 303
15.10 ActiveX开发人员工具箱(BaseCtlFramework) 305
15.10.1 获得BaseCtl Framework 306
15.10.2 建立BaseCtl Framework 306
15.11 用Visual C++和MFC创建一个ActiveX/OLE控件 307
15.11.2 使用合适的Visual C++和MFC版本 308
15.11.1 获得ActiveX SDK 308
15.11.3 使用Visual C++和MFC开发ActiveX和OLE控件 309
15.11.4 MFC对ActiveX和OLE控件的封装 309
15.11.5 OLE Control Wizard 313
15.12 小结 316
第四部分 Win32网络编程 317
第16章 Windows套接字 317
16.1 什么时候使用套接字 317
16.2 什么是套接字 317
16.2.1 数据报套接字 317
16.2.2 流式套接字 318
16.3 使用WinSock API 318
16.3.1 初始化WinSock 318
16.3.2 创建套接字 319
16.4.1 bind() 320
16.4 使用数据报套接字 320
16.4.2 创建服务器套接字 323
16.4.3 字节顺序转换 324
16.4.4 从数据报套接字接收数据 324
16.4.5 向数据报套接字发送数据 324
16.5 使用流式套接字 325
16.5.1 流式套接字和服务器 325
16.5.2 侦听连接 326
16.5.3 接受连接 326
16.5.4 请求连接 327
16.5.5 使用流式套接字来发送和接收数据 328
16.6 等待事件 329
16.6.1 使用Select()函数 329
16.6.2 使用WSAAsyncSelect() 329
16.7 MFC和WinSock API 331
16.7.1 创建CAsyncSocket对象 331
16.6.3 关闭套接字 331
16.7.2 CAsyncSocket对象的错误处理 332
16.7.3 套接字选项和CAsyncSocket 332
16.7.4 发送和接收数据报 332
16.7.5 套接字和服务器连接 332
16.7.6 接受与服务器的连接 333
16.7.7 发送并接收流式数据 333
16.7.8 关闭套接字 334
16.8 使用CSocket对象 334
16.8.1 创建CSocket对象 334
16.8.2 建立连接 334
16.8.3 发送和接收数据 335
16.8.4 与CSocket一起使用CArchive 335
16.8.5 利用CArchive对象来发送和接收数据 335
16.9.1 WinSock2的新函数 336
16.9 Windows Sockets2 336
16.8.6 清除对象 336
16.9.2 使用多种协议 338
16.9.3 多协议名分辨 339
16.9.4 重叠和分散/聚集I/O 340
16.9.5 服务质量 341
16.9.6 多点套接字 341
16.9.7 共享的套接字 341
16.9.8 扩展的连接操作 341
16.9.9 具体协议扩展 342
16.10 小结 342
第17章 管道和邮槽 343
17.1 匿名管道 343
17.1.1 创建一个匿名管道 343
17.1.2 继承的句柄 343
17.1.5 由管道读出数据 344
17.1.4 向管道写入数据 344
17.1.3 使用管道改变标准输入和输出的方向 344
17.1.6 为标准输出使用匿名管道 345
17.2 命名管道 347
17.2.1 创建一个命名管道 347
17.2.2 创建额外的实例 348
17.2.3 侦听连接 349
17.2.4 重叠I/O 350
17.2.5 与命名管道相连接 351
17.2.6 向命名管道写入 351
17.2.7 由命名管道读取数据 352
17.2.8 命名管道的操作 353
17.2.9 关闭管道 353
17.3 邮槽 353
17.3.1 创建邮槽 354
17.3.2 从邮槽读数据 354
17.4 小结 355
17.3.3 向邮槽写入数据 355
17.3.4 关闭邮槽 355
第18章 远程调用(RPC) 356
18.1 开发RPC应用程序 357
18.2 定义接口 358
18.2.1 通用唯一标识符(UUID) 358
18.2.2 端点 359
18.2.3 接口正文 359
18.2.4 IDL属性 360
18.2.5 应用程序配置文件(ACF) 360
18.2.6 使用MIDL编译器 360
18.2.7 MIDL编译器和Visual C++ 361
18.3 开发RPC服务器 361
18.3.1 基础函数 361
18.3.4 注册接口 362
18.3.2 RPC服务器实体 362
18.3.3 协议序列 362
18.3.5 将捆绑输出到名称服务程序 363
18.3.6 侦听请求 363
18.3.7 建立服务器 365
18.4 RPC客户机 365
18.5 RPC中的参数传递 366
18.5.1 数组和字符串 366
18.5.2 联合 367
18.5.3 指针 367
18.5.4 存储分配 367
18.6 捆绑到RPC服务器 368
18.6.1 自动捆绑 368
18.6.2 手工捆绑 369
18.8 小结 373
18.7 RPC的异常处理 373
第19章 信报API 375
19.1 MAPI结构 375
19.1.1 客户应用程序 375
19.1.2 服务提供程序 375
19.1.3 MAPI假脱机程序 376
19.1.4 MAPI API 376
19.1.5 MAPI接口的可用性 377
19.2 在MFC中支持MAPI 377
19.3 通用信报调用 378
19.3.1 开始对话 379
19.3.2 用CMC发送信报 381
19.3.3 用CMC分辨信报的地址 383
19.3.4 用CMC接收信报 385
19.3.5 CMC数据扩展 387
19.5 扩展MAPI 389
19.4 简单MAPI 389
19.6 OLE信报库 390
19.7 小结 390
第20章 电话API(TAPI) 391
20.1 辅助电话服务提供程序 392
20.1.1 发出一次呼叫 392
20.1.2 获取位置信息 392
20.2 基本电话程序 393
20.2.1 初始化TAPI 393
20.2.2 异步TAPI函数 394
20.2.3 协商API版本 396
20.2.4 设备功能 396
20.2.5 发出出站呼叫 398
20.2.6 接收TAPI消息 400
20.2.7 结束一次呼叫 401
20.2.8 接收入站呼叫 402
20.2.9 媒体流设备 403
20.2.10 TAPI地址处理 404
20.2.11 以辅助TAPI服务提供程序的形式注册 404
20.3 增补电话API 404
20.3.1 附加行设备函数 405
20.3.2 电话设备 406
20.4 扩展电话API 407
20.5 小结 407
第21章 加密API(CAPI) 408
21.1 加密101 408
21.1.1 数据加密 408
21.1.2 数字签名 408
21.1.3 对话密钥 409
21.1.4 公共和私人密钥 409
21.1.5 编码类型 409
21.2.2 CryptoAPI配置 410
21.2 CryptoAPI体系结构 410
21.2.1 密钥库 410
21.3 与服务提供程序连接 411
21.4 密钥处理 412
21.4.1 创建一个密钥 412
21.4.2 从口令中派生出密钥 413
21.4.3 密钥参数 414
21.5 密钥交换 414
21.5.1 输出一个密钥 414
21.5.2 输入一个密钥 416
21.6 数据加密 416
21.6.1 多块数据加密 417
21.6.2 加密时进行散列编码 418
21.6.3 数据解密 418
21.7 数字签名 418
21.7.1 创建数字签名 419
21.7.2 验证数字签名 421
21.8 小结 422
第22章 WinInet API 423
22.1 WinInet C API的使用 423
22.1.1 句柄 423
22.1.2 错误处理 423
22.1.3 传送缓冲区参数 424
22.1.4 异步I/O 424
22.2 普通Internet函数 424
22.2.1 开始一个WinInet 对话 424
22.2.2 设置句柄选项 425
22.2.3 查询句柄选项 426
22.2.4 确认Internet的连接 428
22.2.5 与服务器连接 428
22.2.6 增加一个回调函数 429
22.2.7 URL处理 430
22.2.8 基本文件操作 430
22.2.9 查询数据可用性 431
22.2.10 数据读取 431
22.2.11 移动文件指针 431
22.2.12 向Internet文件写数据 432
22.3 FTP客户机函数 432
22.3.1 当前目录 432
22.3.2 创建和更换目录 433
22.3.3 查找文件 433
22.3.4 获取文件 433
22.3.5 发送文件 434
22.3.6 在FTP服务器上打开一个文件 434
22.4.1 HTTP请求 435
22.4 HTTP客户机函数 435
22.3.7 其他FTP文件操作 435
22.4.2 HttpSend Request()错误处理 437
22.4.3 获取响应信息 437
22.4.4 对Cookie Jar初步了解 439
22.4.5 使用高速缓存 439
22.5 Gopher客户机函数 440
22.6 MFC WinInet类 440
22.6.1 CInternetSession 440
22.6.2 连接类 440
22.6.3 文件类 441
22.6.4 CInternetException 441
22.6.5 使用CInternetSession 441
22.6.6 FTP处理 445
22.6.7 HTTP处理 446
22.6.8 Gopher处理 448
22.7 小结 449
第23章 Internet Server API(ISAPI) 450
23.1 开发服务器扩展应用程序 450
23.1.1 ISA入口点 450
23.1.2 扩展控制块(ECB) 453
23.1.3 文件发送 457
23.1.4 异步操作 458
23.1.5 写服务器日志 459
23.1.6 ISA异常处理 459
23.1.7 调试ISA 460
23.1.8 从CGI到ISAPI的转换 460
23.2 ISAPI过滤程序 461
23.2.1 安装过滤程序 461
23.2.2 ISAPI过滤程序结构 461
23.2.3 HTTP.FILTER_CONTEXT结构 464
23.2.4 过滤程序通知处理 467
23.3 MFC对ISAPI的支持 470
23.4 Internet服务管理器API 474
23.5 小结 474
第五部分 数据库编程 477
第24章 数据库概览 477
24.1 ODBC3.0 477
24.2 MFC的数据库类 478
24.3 OLE DB 478
24.4 ActiveX数据对象(ADO) 478
24.5 结构化查询语言 478
24.6 数据定义语言(DDL) 479
24.6.1 表 479
24.6.2 索引 481
24.6.3 视 482
24.8 数据处理语言(DML) 483
24.7.2 取消化先权 483
24.7.1 授与优先权 483
24.7 数据控制语言(DCL) 483
24.8.1 SELECT语句 484
24.8.2 INSERT语句 493
24.8.3 DELETE语句 494
24.8.4 UPDATE语句 494
24.8.5 调用过程 494
24.9 小结 495
第25章 开放数据库连接(ODBC) 496
25.1 ODBC体系结构 496
25.1.1 ODBC驱动程序 497
25.1.2 ODBC驱动管理器 498
25.1.3 数据源 498
25.1.4 ODBC数据源管理器 498
25.2.1 ODBC句柄 499
25.2 ODBC API基础 499
25.1.5 ODBC安装和设置编程 499
25.2.2 ODBC数据类型 500
25.2.3 ODBC诊断 502
25.3 创建ODBC应用程序 503
25.3.1 分配ODBC环境 504
25.3.2 分配连接句柄 504
25.3.3 连接选项 504
25.4 与一个养数据资源连接 505
25.4.1 SQLConnect() 505
25.4.2 SQLDataSources() 507
25.4.3 SQLDriverConnect() 508
25.4.4 SQLBrowseConnect() 508
25.4.5 获取连接信息 509
25.4.6 切断连接 509
25.5.2 SQLExecDirect() 510
25.5 执行SQL语句 510
25.5.1 语句句柄 510
25.5.3 准备SQL语句 511
25.5.4 SQLExecute() 511
25.5.5 参数处理 511
25.6 处理结果集 514
25.6.1 捆绑列 514
25.6.2 SQLBindCol() 514
25.6.3 SQLFetch() 515
25.6.4 关闭光标 516
25.6.5 重复使用语句句柄 516
25.6.6 SQLGetData() 516
25.6.7 列的信息 517
25.7 一次取回多个行 517
25.7.1 块光标 517
25.7.4 使用块光标 518
25.7.2 可滚动光标 518
25.7.3 ODBC光标库 518
25.7.5 用可滚动光标 520
25.8 插入、更新和删除行 522
25.9 异步操作 526
25.10 事务处理 526
25.10.1 ODBC提交模式 526
25.10.2 事务隔离层次 527
25.10.3 光标并发类型 528
25.11 函数目录 529
25.12 小结 529
第26章 MFC数据库类 530
26.1 Cdatabase类 530
26.1.1 打开一个数据库连接 530
26.1.3 用CDatabase执行SQL语句 532
26.1.2 连接信息 532
26.1.4 用CDatabase进行事务处理 533
26.1.5 直接使用ODBC API 534
26.2 CRecordset类 534
26.2.1 从CRecordser中派生类 534
26.2.2 记录字段交换(RFX) 536
26.2.3 打开记录集 537
26.2.4 刷新记录集 539
26.2.5 关闭记录集 539
26.2.6 在记录集中移动 539
26.2.7 成批取回行 540
26.2.8 改变记录集中的数据 544
26.2.9 事务处理 545
26.2.10 使用语句参数 545
26.3.1 创建一个CRecordView 546
26.3 CRecordView类 546
26.2.11 记录集错误处理 546
26.3.2 用CRecordView进行对话框数据交换 547
26.3.3 OnGetRecordset() 547
26.3.4 CRecordView::OnMove() 547
26.4 用AppWizard创建数据库应用程序 548
26.5 小结 548
第27章 使用OLE DB 549
27.1 OLE DB组件 549
27.1.1 数据源 549
27.1.2 会话 550
27.1.3 事务对象 550
27.1.4 命令 551
27.1.5 行集 551
27.2.2 初始化COM 552
27.2.1 应用程序结构 552
27.2 OLE DB数据使用者应用程序 552
27.1.6 枚举器 552
27.1.7 错误 552
27.3 连接数据提供程序 553
27.3.1 创建一个提供程序实例 553
27.3.2 设置提供程序属性 554
27.3.3 使用IDBInitialize 557
27.4 创建会话 558
27.5 打开行集 558
27.6 执行命令 561
27.6.1 创建命令 561
27.6.2 设置命令文本 562
27.6.3 执行命令 562
27.6.4 准备命令 563
27.6.5 使用带参数的命令 563
27.7.1 获得列信息 566
27.7 操作行集 566
27.7.2 操作访问器 568
27.7.3 获取行 570
27.7.4 使用IRowsetLocate 572
27.8 更新数据源 573
27.8.1 IRowsetChange 573
27.8.2 IRowsetUpdate和延迟更新模式 573
27.9 事务 575
27.9.1 开始一个事务 575
27.9.2 提交一个事务 576
27.9.3 终止一个事务 576
27.10 使用枚举器 577
27.10.1 实例化根枚举器 577
27.10.2 ISourcesRowset::GetSourcesRowset() 577
27.10.3 从源行集中实例化对象 578
27.11 扩展的OLE DB错误处理 580
27.12 小结 582
第28章 使用ActiveX数据对象(ADO)编程 583
28.1 ADO数据源 583
28.2 ADO对象 583
28.3 Connection对象 584
28.3.1 Connection属性 584
28.3.2 Connection方法 584
28.4 command对象 584
28.4.1 command属性 585
28.4.2 command方法 585
28.5 Recordset对象 585
28.5.1 Recordset属性 585
28.5.2 Recordset方法 586
28.7 Parameter对象和Paramete集合 587
28.6.3 Field对象方法 587
28.7.1 Pnrameter集合成员 587
28.6 Fields集合和Fields对象 587
28.6.2 Fields对象属性 587
28.6.1 Fields 集合成员 587
28.7.2 Pnrameter对象属性 588
28.7.3 Pnrameter 对象方法 588
28.8 Property对象和Properties集合 588
28.8.1 Properties集合成员 588
28.8.2 Property对象属性 588
28.9 Error对象和Errors集合 589
28.9.1 Errors集合成员 589
28.9.2 Error对象属性 589
28.10 在VC++中使用ADO对象 589
28.10.1 初始化COM 589
28.10.3 COM支持类 590
28.10.2 使用#import 590
28.10.4 智能指针和ADO 591
28.11 处理ADO错误 593
28.11.1 ADO C++异常 593
28.11.2 ADO HRESULT的值 594
28.11.3 Error集合 594
28.12 打开一个连接 596
28.12.1 连接超时 596
28.12.2 连接访问模式 597
28.12.3 缺省数据库 597
28 12.4 关闭连接 597
28.13 使用记录集 597
28.13.1 特性支持 598
28.13.2 打开记录集 598
28.13.5 刷新记录集 600
28.13.3 限制记录集中的行 600
28.13.4 过滤记录集中的行 600
28.13.6 获取记录集中的数据 601
28.13.7 遍历记录集 601
28.13.8 插入新行 604
28.13.9 更新行 605
28.13.10 批量更新 605
28.13.11 删除行 606
28.14 执行命令 606
28.14.1 执行连接的命令 606
28.14.2 使用Command对象 606
28.15 事务 609
28.16 小结 610
29.2.1 GDI 611
29.1 多媒体和图形概览 611
29.2 术语和思想 611
第29章 多媒体编程与Active-Movie1.0 611
第六部分 多媒体、OpenGl和DirectX 611
29.2.2 MCI 612
29.2.3 MMX 612
29.2.4 DVD 612
29.3 ActiveMoive概览 612
29.4 Movie Play例子 612
29.4.1 设置 613
29.4.2 播放电影 615
29.4.3 清除对象 616
29.5 小结 617
第30章 DirectX3.0 618
30.1 从DOS到DirectX 618
30.2 DirectDraw 619
30.2.1 设置 619
30.2.2 使用调色板和颜色 624
30.2.3 使用字体 628
30.2.4 位图和特殊效果 632
30.2.5 轻松结束 635
30.2.6 清除DirectDraw 637
30.3 Direct3D 638
30.3.1 过渡模式与OpenGL比较 638
30.3.2 使用3D Studio 638
30.3.3 设置 638
30.3.4 创建图景 640
30.3.5 清除Direct3D 644
30.4 DirectInput 644
30.4.1 控制操纵杆 644
30.4.2 鼠标和键盘设置 645
30.4.3 窗口消息与DirectInput 648
30.4.4 控制输入设备 648
30.5.1 设置 654
30.5 DirectSound 654
30.4.5 清除DirectInput 654
30.5.2 播放声音效果 657
30.5.3 清除DirectSound 657
30.5.4 播放MIDI音乐 658
30.6 DirectPlay 659
30.6.1 考虑的事情 659
30.6.2 术语 659
30.6.3 其他源 660
30.7 小结 660
第七部分 高级Win32编程 661
第31章 使用注册表 661
31.1 注册表键 661
31.2 注册表值 661
31.3 手工编辑注册表 662
31.4.2 HKEY_CURRENT_CONFIC 663
31.4.1 HKEY_LOCAL_MACHINE 663
31.4 注册表结构 663
31.4.3 HKEY_USERS 664
31.4.4 HKEY_CURRENT_USER 664
31.4.5 HKEY_CLASSES_ROOT 664
31.4.6 HKEY_DNY_DATA 664
31.4.7 HKEY_PERPORMANCE_DATA 665
31.5 INI文件映像 665
31.6 注册表API 665
31.6.1 打开键 665
31.6.2 从注册表中读数据 667
31.6.3 创建键 669
31.6.4 写入注册表 670
31.6.5 注册表的安全性 671
31.6.6 将注册表键保存到文件中 671
31.7 小结 672
31.6.7 远程注册表访问 672
31.6.8 注册表更改通知 672
第32章 扩展Windows外壳 673
32.1 使用任务栏 673
32.1.1 任务栏按钮 673
32.1.2 系统信息区 675
32.2 应用程序桌面工具条 679
32.2.1 Appbar消息 679
32.2.2 注册一个Appbar 680
32.2.3 定位Appbar 680
32.2.4 处理Appbar通知 681
32.2.5 自动隐藏Appbar 682
32.2.6 删除一个Appbar 682
32.3 长文件名 683
32.4 外壳文件操作 683
32.4.1 用户确认 684
32.4.2 进度对话框 685
32.4.3 操作成功 686
32.4.4 文件映射 687
32.4.5 外壳名空间 687
32.4.6 开始研究 687
32.4.7 遍历树 688
32.4.8 其他信息 690
32.4.9 消除 691
32.4.10 工作中的外壳API 691
32.5 外壳扩展 693
32.6 小结 693
第33章 定制AppWizard 694
33.1 AppWizard的工作原理 694
33.2 创建定制的AppWizard 694
33.3 一个定制AppWizard项目中的组件 695
33.4 模板文件 696
33.4.1 NEWPROJ.INF 696
33.4.2 模板文件中的宏 697
33.4.3 模板文件中的指示 698
33.4.4 CONFIRM.INF 699
33.4.5 文本模板 700
33.4.6 二进制资源模板 701
33.5 设计你的AppWizard DLL 701
33.5.1 定义宏 702
33.5.2 创建步骤对话框 703
33.6 编连一个定制的AppWizard 703
33.7 调试一个定制AppWizard 703
33.8 小结 703
34.1 Microsoft Logo程序 705
第34章 开发完整的应用程序 705
第八部分 最后一击 705
34.2 Windows NT和Windows95 Logo要求 706
34.3 用户接口指南 706
34.4 应用程序的安装 707
34.4.1 安装指南 707
34.4.2 拷贝文件 708
34.4.3 提醒更换介质 708
34.4.4 覆盖文件 709
34.4.5 使用计数 709
34.4.6 替换使用中的文件 709
34.4.7 增加注册表入口 709
34.4.8 使用AutoPlay 710
34.4.9 InstallShield 711
34.4.10 SetupAPI 711
34.6 小结 712
34.5 卸载程序 712
第35章 加入Windows帮助 713
35.1 WinHelp基础 713
35.2 AppWizard中的帮助选项 715
35.3 Help项目组件 716
35.4 编辑帮助主题 716
35.4.1 创建帮助主题 717
35.4.2 增加热点 718
35.4.3 在Help文件中包含图形 718
35.5 管理Help项目 718
35.5.1 帮助项目文件 718
35.5.2 目录文件 719
35.5.3 编译帮助项目 720
35.5.4 测试帮助项目 721
A.1.4 会议 721
35.6.2 通过MFC使用帮助 722
35.6.1 :: WinHelp() 722
35.6 从你的应用程序调用WinHelp 722
35.7 增加环境敏感帮助 723
35.8 小结 724
第九部分 附录 725
附录A 其他资源 725
A.1 Visual C++资源 725
A.1.1 Microsoft开发人员的网络 725
A.1.2 硬拷贝Visual C++文档 729
A.1.3 杂志和期刊 729
A.1.5 软件 732
A.1.6 论文和文章 733
A.1.7 有关Visual C++和Windows程序设计的书 734
A.1.8 Internet 736
A.1.9 新闻组和FAQ 737
A.2 小结 738