
Visual C++自诞生以来,一直是Windows环境下最主要的应用开发系统。本书的第一版和第二版主要针对16位Windows应用程序的开发,以MFC 2.0和2.5为基础,向读者展示了Visual C++软件系统的魅力,而且在第二版中,还介绍了ODBC数据库管理以及OLE与自动化方面的高级编程技术。
本书主要针对Visual C++ 5.0版本,以Windows NT 4.0与Windows 95或更高版本的32位Windows为操作系统平台,以MFC 4.21为基础,全面介绍了各种MFC类库应用程序的开发过程。由于Win32与Win16有着很大的差异,所以本书对以前的版本作了较大的修改,有些章节是完全重写的,如Win32内存管理、动态连接库编程、ActiveX控件等,但是在MFC基本框架方面又以继承为主,这就保证了读者在从16位环境转到32位环境时程序设计的连续性,也保证了原来的16位代码可以很方便地被移植到32位系统中来。但本书中,在讲述应用程序框架和文档-视图结构的过程中,涉及到了很多Win32的知识,以及Developer Studio环境提供的很多实用工具,包括AppWizard、ClassWizard等,因此,即使是熟练的程序员也有必要再阅读这些内容。
除了基本的MFC应用框架知识外,本书还增加了一些新的内容。在数据库应用开发方面,Visual C++ 5.0除了支持原来的版本中就已经有的ODBC接口外,又增加了新的DAO(数据访问对象)接口,在MFC 4.21的支持下,用户可以快速建立数据库应用程序;上一版本介绍了OLE自动化的程序设计方法,随着这几年新技术的不断发展,Microsoft在COM和OLE的基础上又引入了ActiveX技术,本书用较多的篇幅介绍了ActiveX技术,通过这部分内容,读者不仅可领略到ActiveX技术的概貌,还可以学习一些深入的程序设计特性;除此之外,本书还介绍了Internet/Intranet程序设计技术,包括服务器软件和客户软件的编写以及IIS编程;最后,本书介绍了ActiveX文档技术,如果读者在从事网络方面的工作,那么相信这些内容可以为您提供基本的技术支持。
Visual C++不仅仅是C++语言的集成开发环境,而且与Win32紧密相连,所以,利用Visual C++开发系统可以完成各种各样应用程序的开发,从底层软件直到上层直接面向用户的软件都可以用Visual C++来完成开发;而且Visual C++强大的调试功能也为大型复杂软件的开发提供了有效的排错手段。随着软件版本的不断升级,其功能也越来越强大,几乎包括了Windows应用的各个方面,所以Visual C++成了Windows系统平台上最强大的应用程序开发系统。本书从程序员的角度系统地介绍了Visual C++ 5.0的各项编程技术,向读者揭示了Visual C++ 5.0的技术要点,是Visual C++ 5.0的标准参考书,是一本不可多得的好书。
本书基本上保持了前两个版本的结构和风格,但由于译者水平有限,难免有不妥之处。尤其是一些新技术术语,在译法上力求正确反映其实际含义又符合中文习惯。若有不当之处,还请读者见谅。
在以前三个版本的基础上,本书全面覆盖了Visual C++开发系统的各个方面,还涉及了Windows操作系统的32位编程的各项复杂技术。本书可以作为用Microsoft Visual C++开发Windows应用程序的标准参考书。
本书从Windows和Visual C++的基本技术出发,讲述了应用程序框架的技术细节,同时还包括以下一些技术:
■ 基础——事件控制、GDI、对话框、内存管理、SDI和MDI、打印和帮助
■ 高级话题——多线程、DIB、ODBC和DLL
■ ActiveX技术——ActiveX控件、COM、自动化、统一数据传输、结构化存储和复合文档技术
■ Internet编程——Winsock、MFC WinInet、ISAPI对IIS的扩展和ActiveX文档
*本书随附的光盘包含所有示例程序的源代码。
前言29
第一部分Windows、Visual C++和应用程序框架基础
第一章Microsoft Windows和Visual C++3
1.1Windows的编程模式3
1.1.1消息处理3
1.1.2Windows的图形设备接口(GDI)4
1.1.3基于资源的程序设计4
1.1.4内存管理4
1.1.5动态连接库(DLL)5
1.1.6Win32应用程序编程接口5
1.2Visual C++的组成5
1.2.1Microsoft Developer Studio 97和创建过程6
1.2.2资源编辑器——Workspace ResourceView8
1.2.3C/C++编译器8
1.2.4资源编译器9
1.2.5连接器9
1.2.6调试器9
1.2.7AppWizard9
1.2.8ClassWizard10
1.2.9源程序浏览器10
1.2.10联机帮助11
1.2.11Windows诊断工具12
1.2.12源代码控制12
1.2.13Gallery12
1.2.14Microsoft基本类库4.21版13
1.2.15Microsoft ActiveX 模板库13
第二章Microsoft基本类库应用程序框架14
2.1为什么要使用应用程序框架14
2.1.1学习曲线17
2.2什么是应用程序框架18
2.2.1应用程序框架和MFC库18
2.2.2应用程序框架示例18
2.3MFC库消息映射21
2.3.1文档和视图22
第二部分MFC库中的视图类
第三章从“Hello,world!\"着手学习AppWizard27
3.1什么是视图27
3.2单文档界面(SDI)和多文档界面(MDI)28
3.3“不做任何事情”的应用程序28
3.4CEx03aView视图类32
3.5在视窗内绘图——Windows的图形设备接口32
3.5.1OnDraw成员函数33
3.5.2Windows设备环境33
3.5.3往EX03A程序中加入绘制代码33
3.6资源编辑器简介35
3.6.1ex03a.rc的内容35
3.6.2运行对话框资源编辑器36
3.7Win32 Debug目标和Win32 Release目标37
3.8允许诊断宏37
3.9对预编译头文件的理解38
3.10两种方法运行程序39
第四章基本事件处理、映射模式和滚动视图40
4.1获取用户输入——消息映射函数40
4.1.1消息映射40
4.1.2保存视图的状态类数据成员41
4.1.3初始化视图类数据成员42
4.1.4使矩形区域无效42
4.1.5Windows的客户区域42
4.1.6CRect,CPoint和CSize类的运算43
4.1.7一个点是否在矩形内43
4.1.8CRect的LPRECT操作符43
4.1.9一个点是否在椭圆内44
4.2EX04A示例程序44
4.3对EX04A使用ClassWizard48
4.3.1同时使用AppWizard和ClassWizard49
4.4映射模式51
4.4.1MM-TEXT映射模式52
4.4.2“固定比例”映射模式53
4.4.3“可变比例”映射模式53
4.4.4坐标变换54
4.4.5EX04B示例程序——转换到MM-HIMETRIC映射模式56
4.5滚动视窗57
4.5.1窗口比人们所见到的要大57
4.5.2滚动条58
4.5.3滚动方式的选择58
4.5.4OnInitialUpdate函数58
4.5.5接收键盘输入58
4.5.6EX04C滚动示例程序59
4.6其他Windows消息62
4.6.1WM-CREATE消息62
4.6.2WM-CLOSE消息63
4.6.3WM-QUERYENDSESSION消息63
4.6.4WM-DESTROY消息63
4.6.5WM-NCDESTROY消息63
第五章图形设备接口(GDI)、颜色及字体64
5.1设备环境类64
5.1.1显示设备环境类CClientDC和CWindowDC65
5.1.2构造和析构CDC对象65
5.1.3设备环境的状态66
5.1.4CPaint DC类66
5.2GDI对象67
5.2.1GDI对象的构造与析构67
5.2.2跟踪GDI对象67
5.2.3库存的GDI对象68
5.2.4GDI选择的有效期69
5.3Windows的颜色映射70
5.3.1标准视频图形阵列(VGA)显示卡70
5.3.2256色显示卡71
5.3.316位颜色显示卡71
5.3.424位颜色显示卡72
5.4字体72
5.4.1字体是GDI对象72
5.4.2选择字体72
5.4.3打印字体73
5.4.4显示字体73
5.4.5显示器的逻辑英寸和物理英寸73
5.4.6计算字符高度74
5.5EX05A示例程序75
5.5.1EX05A程序的组成元素78
5.6EX05B程序79
5.6.1EX05B程序的组成元素82
5.7EX05C示例程序——再次使用CScrollView82
5.7.1EX05C程序的组成元素86
5.7.2CScrollView的SetScaleToFitSize模式87
5.7.3在滚动视图中使用逻辑twips映射模式88
第六章模式对话框和Windows通用控件89
6.1模式和无模式对话框89
6.2资源和控件90
6.3模式对话框的编程90
6.4包罗万象的对话框——EX06A示例程序91
6.4.1创建对话框资源92
6.4.2ClassWizard和对话框类99
6.4.3将对话框与视图相连接102
6.4.4深入理解EX06A应用程序104
6.5对话框程序的改进105
6.5.1获得OnOK退出控制106
6.5.2OnCancel处理107
6.5.3和滚动条控件挂上钩107
6.6控件的标识:CWnd指针和控件ID109
6.7设置对话框的背景色和其中控件的颜色109
6.8在对话框窗口内绘图111
6.9在运行时加入对话框控件111
6.10利用其他的控件特性112
6.11Windows通用控件112
6.11.1进度指示器控件113
6.11.2滑杆条(Trackbar)控件113
6.11.3微调按钮控件114
6.11.4列表控件114
6.11.5树状控件114
6.11.6WM-NOTIFY消息115
6.12EX06B示例程序115
6.13其他Windows通用控件125
第七章无模式对话框和Windows通用对话框类126
71无模式对话框126
711创建无模式对话框126
712用户定义的消息127
713对话框的归属127
714无模式对话框的例子——EX07A127
72CFormView类——另外一种可供选择的无模式对话框134
73Windows通用对话框134
731直接使用CFileDialog类134
732从通用对话框类进行派生135
733嵌套对话框135
734使用CFileDialog的一个例子——EX07B135
735CFileDialog的其他可定制特性141
第八章使用ActiveX控件142
81ActiveX控件和普通的Windows控件142
811普通的Windows控件——参考体系142
812ActiveX控件与普通控件的相同点143
813ActiveX控件与普通控件的不同点——属性和方法143
82安装ActiveX控件144
83日历控件145
84ActiveX控件包容器编程147
841属性访问147
842ClassWizard为ActiveX控件产生的C++类148
843AppWizard对ActiveX控件的支持150
844ClassWizard和包容器对话框150
845对话框类数据成员和控件类的用法150
846映射ActiveX控件事件151
847把ActiveX控件锁定在内存里152
85EX08A示例程序——ActiveX控件对话框包容器152
86ActiveX控件在HTML文件中的使用160
87在运行时创建ActiveX控件160
88EX08B示例程序——Web浏览器ActiveX控件161
89EX08C示例程序——一个完整的双窗口浏览器165
810图形属性165
811约束属性——改变通知166
812其他的ActiveX控件167
第九章Win32内存管理168
91进程和内存空间168
911Windows 95进程地址空间170
912Windows NT进程地址空间170
92虚拟内存如何工作170
93VirtualAlloc函数——占用和保留内存173
94Windows堆和GlobalAlloc函数族173
95小内存堆,C++的new和delete操作符,-heapmin174
96内存映射文件175
97访问资源176
98管理动态内存的一些提示177
99常量数据的优化存储177
第十章位图179
101GDI位图和与设备无关的位图179
102彩色位图和单色位图180
103使用GDI位图180
1031从资源中装入GDI位图180
1032显示映射模式的作用181
1033对位进行伸缩处理182
1034EX10A示例程序182
104利用位图改进屏幕显示185
1041EX10B示例程序185
1042Windows动画189
105DIB和CDib类190
1051关于调色板编程的术语190
1052DIB、象素和颜色表191
1053BMP文件中DIB的结构192
1054DIB访问函数193
1055CDib类193
1056DIB显示性能198
1057EX10C示例程序199
106进一步使用DIB202
1061LoadImage函数202
1062DrawDibDraw函数203
107在按钮上设置位图204
1071EX10D示例程序205
1072进一步使用位图按钮208
第十一章Windows消息处理和多线程编程209
111Windows消息处理209
1111单线程程序处理消息的过程209
1112交出控制210
1113计时器210
1114EX11A示例程序211
112空状态处理214
113多线程编程215
1131编写辅助线程函数和启动线程215
1132主线程如何和辅助线程通话216
1133辅助线程如何和主线程通话217
1134EX11B示例程序217
1135用事件使线程同步219
1136EX11C示例程序219
1137线程阻塞221
1138排斥区222
1139互斥体(mutex)和信号(semaphore)223
11310用户界面线程(UI线程)224
第三部分文档视图结构
第十二章菜单、键盘加速键、复文本编辑控件和属性表227
121主框架窗口和文档类227
122Windows的菜单228
123键盘加速键229
124命令处理229
1241派生类中的命令消息控制230
1242更新命令用户界面消息控制函数231
1243对话框发送的命令231
125应用程序框架的内含菜单项232
126菜单项的允许/禁用232
127MFC文本编辑选择233
1271CEditView类233
1272CRichEditView类233
1273CRichEditCtrl类233
128EX12A示例程序234
129属性表239
1291创建属性表239
1292属性表数据交换239
1210改进EX12A示例程序240
1211Apply按钮的处理过程254
1212CMenu类254
1213创建浮动的弹出式菜单255
1214扩展命令处理256
第十三章工具栏和状态栏258
131控制栏和应用程序框架258
132工具栏259
1321工具栏位图259
1322按钮的状态259
1323工具栏和命令消息260
1324工具栏更新命令UI消息控制函数261
133工具提示261
134寻找主框架窗口261
135EX13A工具栏示例程序262
136状态栏267
1361状态栏的定义267
1362信息行268
1363状态指示器268
1364获得对状态栏的控制268
137EX13B状态栏示例程序269
第十四章可重用框架窗口基类275
141为什么可重用基类难以设计275
142CPersistentFrame类276
143CFrameWnd类和ActivateFrame成员函数276
144PreCreateWindow成员函数277
145Windows注册表278
146使用CString类280
147最大化窗口的位置281
148控制栏状态和注册表282
149静态数据成员282
1410默认窗口矩形282
1411EX14A示例程序283
1412MDI应用程序中的持续框架289
第十五章文档与视图的分离291
15.1文档\|视图之间的相互作用函数291
15.1.1CView∷GetDocument函数291
15.1.2CDocumeat∷Update AllViews函数292
15.1.3CView∷OnUpdate函数293
15.1.4CView∷OnInitialUpdate函数293
15.1.5CDocument∷OnNewDocument函数293
15.2最简单的文档\|视图应用程序294
15.3CFormView类294
15.4CObject类295
15.5诊断信息转储296
15.5.1TRACE宏296
15.5.2afxDump对象296
15.5.3信息转储环境及CObject类297
15.5.4未被删除对象的自动信息转储298
15.6EX15A示例程序300
15.7更加高级的文档\|视图之间的相互作用307
15.8CDocument∷DeleteContents函数308
15.9CObList集合类308
15.9.1对先入先出列表使用CObList类309
15.9.2在CObList中进行迭代——POSITION变量310
15.9.3CTypedPtrList模板集合类311
15.9.4信息转储环境及集合类312
15.10EX15B示例程序313
15.10.1资源要求314
15.10.2代码要求315
15.10.3CStudentDoc316
15.10.4CStudentView320
15.10.5测试EX15B应用程序330
15.11留给读者的两个练习330
第十六章读和写文档——SDI应用程序331
16.1什么是序列化331
16.1.1磁盘文件和归档(Archives)332
16.1.2使类可序列化332
16.1.3编写Serialize函数333
16.1.4从归档中载入——内嵌对象和指针334
16.1.5使集合序列化335
16.1.6Serialize函数和应用程序框架336
16.2SDI应用程序336
16.2.1Windows应用程序对象336
16.2.2文档模板类337
16.2.3文档模板资源339
16.2.4SDI文档的多视图339
16.2.5创建空文档——CWinApp∷OnFileNew函数339
16.2.6文档类的OnNewDocument函数340
16.2.7连接File Open与序列化代码——OnFileOpen函数340
16.2.8文档类的DeleteContents函数341
16.2.9将File Save和File Save As与序列化代码相连接341
16.2.10文档的“脏”标志342
16.3EX16A——序列化SDI示例程序342
16.3.1CStudent343
16.3.2CEx16aApp343
16.3.3CFrameWnd348
16.3.4CStudentDoc352
16.3.5CStudentView353
16.3.6测试EX16A应用程序353
16.4从Explorer启动及拖放354
16.4.1程序注册354
16.4.2在文档上双击鼠标355
16.4.3允许拖放355
16.4.4程序启动参数356
16.4.5试验用Explorer启动程序及拖放功能356
第十七章读和写文档——MDI应用程序357
17.1MDI应用程序357
17.1.1一个典型的具有MFC库风格的MDI应用程序357
17.1.2MDI应用程序对象360
17.1.3MDI文档模板类360
17.1.4MDI框架窗口和MDI子窗口360
17.1.5主框架和文档模板资源361
17.1.6创建空文档——CWinApp∷OnFileNew函数362
17.1.7为现有文档创建新的视图362
17.1.8载入和存储文档363
17.1.9多文档模板363
17.1.10Explorer启动及拖放364
17.2EX17A示例程序364
17.2.1CEx17aApp365
17.2.2CMainFrame370
17.2.3CChildFrame373
17.2.4测试EX17A应用程序376
第十八章打印和打印预览377
18.1Windows的打印377
18.1.1标准打印对话框377
1812交互选择打印页码377
1813显示页和打印页379
182打印预览379
183有关打印机的程序设计380
18.3.1打印机设备环境和CView∷OnDraw函数380
18.3.2CView∷OnPrint函数380
1833准备设备环境——CView∷OnPrepareDC函数380
1834打印任务的开始和结束381
184EX18A示例程序——一个所见即所得的打印程序381
18.5读取打印机矩形框388
18.6再看模板集合类——CArray类388
18.7EX18B示例程序——多页打印程序389
第十九章切分窗口和多视图395
19.1切分窗口395
19.2多视图选择395
19.3动态和静态切分窗口396
19.4EX19A示例程序——具有单个视图类的SDI动态切分396
19.4.1与切分有关的资源397
19.4.2CMainFrame397
19.4.3测试EX19A应用程序398
19.5EX19B示例程序——双视图类SDI静态切分399
19.5.1CHexView399
19.5.2CMainFrame400
19.5.3测试EX19B应用程序400
196EX19C示例程序——切换没有切分的视图类401
19.6.1资源要求401
19.6.2CMainFrame401
19.6.3测试EX19C应用程序403
19.7EX19D示例程序——多视图类MDI应用程序403
1971资源要求404
19.7.2CEx19dApp404
19.7.3CMainFrame405
1974测试EX19D应用程序406
第二十章上下文相关帮助407
20.1Windows的WinHelp程序407
20.1.1复文本格式(RTF)407
20.1.2编写简单的帮助文件408
20.1.3改进的Table Of Contents412
202应用程序框架与WinHelp413
20.2.1调用WinHelp414
2022使用搜索字符串414
2023从应用程序的菜单调用WinHelp415
2024帮助上下文别名415
2025确定帮助上下文415
2026F1帮助416
2027Shift-F1 帮助416
2028消息框帮助——AfxMessageBox函数417
20.2.9一般的帮助417
203帮助示例——不需要任何编程418
204MAKEHELP处理420
205帮助命令处理420
20.5.1F1处理过程421
20.5.2ShiftF1处理过程421
20.6帮助命令处理示例程序——EX20B422
20.6.1头文件要求422
20.6.2CStringView422
20.6.3CHexView423
20.6.4资源要求424
20.6.5帮助文件要求424
20.6.6测试EX20B应用程序425
第二十一章动态连接库426
211基本DLL理论426
2111导入如何与导出相匹配427
2112隐式连接和显式连接427
2113符号连接和序号连接428
2114DLL入口点——DllMain429
2115实例句柄——装载资源429
2116客户程序如何找到DLL430
2117调试DLL430
212MFC DLL——扩展的和正规的430
2121共享的MFC DLL和Windows DLL431
2122MFC扩展DLL——导出类432
2123MFC扩展DLL资源搜索的顺序432
2124EX21A示例程序——MFC扩展DLL433
2125EX21B示例程序——DLL测试客户程序435
2126MFC正规DLL——CWinApp派生类436
2127使用AFX-MANAGE-STATE宏436
2128MFC正规DLL资源搜索顺序436
2129EX21C示例程序——MFC正规DLL437
21210修改EX21B示例程序——加入代码以测试ex21c.dll438
213自定义控件DLL440
2131什么是自定义控件440
2132自定义控件的窗口类440
2133MFC库和WndProc函数441
2134自定义控件通知消息441
2135发送给控件的用户定义消息442
2136EX21D示例程序——自定义控件442
2137再修改EX21B示例程序——加入代码以测试ex21d.dll448
第二十二章不带文档或视图类的MFC程序452
22.1EX22A示例程序——一个基于对话框的应用程序452
22.1.1应用程序类InitInstance函数454
22.1.2对话框类和程序图标455
22.2EX22B示例——一个SDI应用程序456
22.2.1应用程序类InitInstance函数457
22.2.2CMainFrame类458
22.3EX22C示例程序——一个MDI应用程序458
22.3.1应用类程序InitInstance函数459
22.3.2CMainFrame类460
22.3.3CChildFrame类462
22.3.4资源要求462
22.4定制(Custom) AppWizard463
第四部分ActiveX:组件对象模型、自动化和OLE
第二十三章组件对象模型467
23.1ActiveX技术背景467
23.2组件对象模型(COM)468
23.2.1COM所解决的问题468
23.2.2COM的本质468
23.2.3什么是COM接口469
23.2.4IUnknown接口和QueryInterface成员函数473
23.2.5引用计数:AddRef和Release函数475
23.2.6类厂(class factory)476
23.2.7CCmdTarget类477
23.2.8EX23A示例程序——一个模拟的COM478
23.3MFC库中实际的COM486
23.3.1COM的CoGetClassObject函数486
23.3.2COM和Windows注册表487
23.3.3运行时对象注册488
23.3.4COM客户程序如何调用进程内组件489
23.3.5COM客户程序如何调用进程外组件491
23.3.6MFC接口宏493
23.3.7MFC的COleObjectFactory类494
23.3.8AppWizard/ClassWizard对COM进程内组件的支持494
23.3.9MFC COM客户程序496
23.3.10EX23B示例程序——MFC COM进程内组件496
23.3.11EX23C示例程序——MFC COM客户501
23.4包容、集合和继承502
第二十四章自动化504
24.1C++与Visual Basic for Applications (VBA)之间的连接504
24.2自动化客户和自动化组件505
24.3Microsoft Excel——一种比Visual Basic还好的Visual Basic505
24.4属性(property)、方法(method)和集合(collection)507
24.5自动化所解决的问题508
24.6IDispatch接口508
24.7自动化程序设计的选择509
24.8MFC IDispatch的实现510
24.9一个MFC自动化组件511
24.10一个MFC自动化客户程序512
24.11使用编译器#import指令的自动化客户程序514
24.12VARIANT类型515
24.13COleVariant类517
24.14Invoke的参数和返回值的类型转换519
24.15自动化示例521
24.15.1EX24A自动化组件EXE示例——不带任何用户界面521
24.15.2EX24B自动化组件DLL示例程序529
24.15.3EX24C SDI自动化组件EXE示例——带用户界面538
24.15.4EX24D自动化客户示例程序544
24.15.5EX24E自动化客户示例程序559
24.16VBA早绑定562
24.16.1注册类型库563
24.16.2组件如何注册自己的类型库564
24.16.3ODL文件564
24.16.4Excel如何使用类型库565
24.16.5为什么使用早绑定567
24.16.6客户组件的快速连接567
第二十五章统一数据传输——剪贴板传输以及OLE拖放568
25.1IDataObject接口568
25.2IDataObject如何增强标准剪贴板的支持568
25.3FORMATETC和STGMEDIUM结构569
25.3.1FORMATETC569
25.3.2STGMEDIUM570
25.3.3IDataObject接口成员函数570
25.4MFC统一数据传输支持571
25.4.1COleDataSource类572
25.4.2COleDataObject类573
25.4.3MFC数据对象剪贴板传输574
25.5MFC CRectTracker类576
25.5.1CRectTracker类成员函数576
25.5.2CRectTracker类矩形坐标转换577
25.6EX25A示例程序——数据对象剪贴板577
25.6.1CMainFrame类578
25.6.2CEx25aDoc类578
25.6.3CEx25aView类578
25.7MFC拖放587
25.7.1传输的源方587
25.7.2传输的目标方587
25.7.3拖放的顺序588
25.8EX25B示例程序——OLE拖放589
25.8.1CEx25bDoc类589
25.8.2CEx25bView类589
25.9Windows应用程序和拖放——Dobjview592
第二十六章结构化存储593
26.1复合文件593
26.2存储(Storage)和IStorage接口594
26.2.1获取IStorage指针596
26.2.2释放STATSTG内存596
26.2.3对存储对象的元素进行枚举596
26.2.4进程间共享存储597
26.3流(Stream)和IStream接口597
26.3.1IStream接口成员函数597
26.3.2IStream编程598
26.4ILockBytes接口599
26.5EX26A示例程序——结构化存储599
26.5.1菜单600
26.5.2CEx26aView类600
26.5.3辅助线程600
26.6结构化存储和持久COM对象604
26.6.1IPersistStorage接口605
26.6.2IPersistStream接口606
26.6.3IPersistStream编程606
26.7EX26B示例程序——一个持久DLL组件607
26.8EX26C示例程序——一个持久存储客户程序613
26.9复合文件碎片的处理617
26.10复合文件的其他优点618
第二十七章OLE嵌入组件和包容器619
27.1嵌入和实地激活(可视编辑)619
27.2最小服务器和完备服务器(组件)——链接620
27.3可视编辑前景暗淡的一面620
27.4Windows图元文件和内嵌对象621
27.5组件程序的MFC OLE结构622
27.6EX27A示例程序——MFC实地激活最小服务器623
27.6.1MDI嵌入组件627
27.6.2实地组件调整大小的思路628
27.7包容器组件相互作用628
27.7.1使用组件的IOleObject接口629
27.7.2装入和保存组件自身的数据——组件文档630
27.7.3剪贴板数据传输630
27.7.4获得组件的图元文件630
27.7.5进程内控制器的角色631
27.8组件状态632
27.8.1包容器接口632
27.8.2通报连接633
27.8.3剪贴板图元文件634
27.9接口简要说明634
27.9.1IOleObject接口634
27.9.2IViewObject2接口635
27.9.3IOleClientSite接口635
27.9.4IAdviseSink接口636
27.10OLE辅助函数636
27.11OLE嵌入包容器应用程序637
27.11.1MFC对OLE包容器的支持637
27.11.2一些包容器限制638
27.11.3包容器特性638
27.12EX27B示例程序——嵌入包容器638
27.12.1CEx27bView类639
27.12.2CEx27bDoc类652
27.13EX27C示例程序——OLE嵌入组件660
27.13.1CEx27cView类661
27.13.2CEx27cDoc类661
第五部分数据库管理
第二十八章Microsoft ODBC数据库管理671
28.1数据库管理的优势671
28.2结构化查询语言672
28.3ODBC标准673
28.3.1ODBC结构673
28.3.2ODBC SDK编程674
28.4MFC ODBC类——CRecordset和CDatabase675
28.4.1记录集中关于行的计数677
28.4.2处理ODBC异常677
28.5学生注册数据库678
28.6EX28A记录集示例程序678
28.7EX28A示例程序中的元素684
28.7.1记录集类与应用程序之间的连接684
28.7.2CEx28aView类的OnInitialUpdate成员函数684
28.7.3CEx28aView类的OnDraw成员函数685
28.8筛选器和排序字符串686
28.9连接两个数据库表686
28.10MFC CRecordView类687
28.11EX28B记录查看示例程序688
28.12多记录集693
28.12.1EX28C多记录集示例程序694
28.12.2参数化查询695
28.13ODBC多线程696
28.14大批行数据获取(bulk row fetch)696
28.15使用不带绑定的记录集696
第二十九章Microsoft Data Access Objects数据库管理699
29.1DAO、COM和Microsoft Jet数据库引擎699
29.2DAO和VBA699
29.3DAO和MFC700
29.4利用DAO可以打开什么样的数据库701
29.5按ODBC模式使用DAO——快照和动态集701
29.6DAO表类型记录集702
29.7DAO QueryDef和TableDef703
29.8DAO多线程情况703
29.9在滚动窗口中显示数据库的行703
29.9.1滚动显示方法703
29.9.2一个行-视图类704
29.9.3基类和派生类的分工处理705
29.9.4CRowView的纯虚成员函数706
29.9.5其他的CRowView函数706
29.10动态记录集的编程707
29.11EX29A示例程序708
29.11.1CEx29aApp709
29.11.2CMainFrame和CChildFrame709
29.11.3CEx29aDoc709
29.11.4CEx29aView716
29.11.5CTableSelect719
29.11.6CIsamSelect720
29.12EX29A资源文件721
29.13运行EX29A程序722
第六部分Internet程序设计
第三十章TCP/IP、Winsock和WinInet725
30.1既针对COM也可以不需要COM725
30.2Internet基础725
30.2.1网络协议——层726
30.2.2Internet协议726
30.2.3用户报文协议727
30.2.4IP地址格式——网络字节顺序728
30.2.5传输控制协议729
30.2.6域名系统(Domain Name System)730
30.2.7HTTP基础732
30.2.8FTP基础734
30.2.9Internet和Intranet734
30.3建立自己的价值S| 99 的Intranet734
30.3.1NT文件系统和文件分配表735
30.3.2网络硬件735
30.3.3对Windows进行网络配置735
30.3.4Intranet的主机名——HOSTS文件736
30.3.5测试Intranet——Ping程序736
30.3.6只有一台计算机的Intranet——TCP/IP环形地址736
30.4Winsock737
30.4.1同步和异步Winsock编程737
30.4.2MFC Winsock类737
30.4.3Blocking Socket类737
30.4.4一个简化了的HTTP服务器程序745
30.4.5一个简化了的HTTP客户端程序747
30.5用CHttpBlockingSocket创建一个Web服务器程序749
30.5.1EX30A服务器限制749
30.5.2EX30A服务器结构749
30.5.3使用Win32 TransmitFile函数750
30.5.4编译和测试EX30A751
30.5.5使用Telnet752
30.6用CHttpBlockingSocket创建一个Web客户端程序752
30.6.1EX30A Winsock客户752
30.6.2EX30A对代理服务器的支持753
30.6.3测试EX30A Winsock客户753
30.7WinInet753
30.7.1WinInet相对于Winsock的优势754
30.7.2MFC WinInet类754
30.7.3Internet会话状态回调756
30.7.4一个简化了的WinInet客户程序757
30.8用MFC WinInet类创建一个Web客户758
30.8.1EX30A WinInet Client #1——使用CHttpConnection758
30.8.2测试WinInet Client #1758
30.8.3EX30A WinInet Client #2——使用OpenURL759
30.8.4测试WinInet Client #2760
30.9异步Moniker文件760
30.9.1Moniker760
30.9.2MFC CAsyncMonikerFile类760
30.9.3在程序中使用CAsyncMonikerFile类760
30.9.4异步moniker文件和WinInet编程761
第三十一章Microsoft Internet Information Server编程763
31.1IIS的替代产品763
31.2Microsoft IIS763
31.2.1安装和控制IIS763
31.2.2运行Internet Service Manager764
31.2.3IIS的安全性764
31.2.4IIS765
31.2.5IIS日志记录766
31.2.6测试IIS766
31.3ISAPI服务器扩展767
31.3.1通用网关接口和ISAPI767
31.3.2一个简单的ISAPI服务器扩展GET请求767
31.3.3HTML窗体——GET和POST768
31.3.4编写ISAPI服务器扩展DLL769
31.3.5MFC ISAPI服务器扩展类770
31.4一个实际的ISAPI服务器扩展——ex31a.dll771
31.4.1第一步——获取定单772
31.4.2第二步——处理确认窗体775
31.4.3编译并测试ex31a.dll776
31.4.4调试EX31A DLL776
31.5ISAPI 数据库访问777
31.6使用HTTP Cookie来连接事务778
31.6.1Cookie如何工作778
31.6.2ISAPI服务器扩展如何处理Cookie779
31.6.3使用Cookie的一些问题779
31.7WWW鉴定779
31.7.1基本鉴定779
31.7.2Windows NT问讯/应答鉴定780
31.7.3安全套接字层(SSL)780
31.8ISAPI过滤器781
31.8.1编写ISAPI过滤器DLL781
31.8.2MFC ISAPI过滤器类781
31.9ISAPI过滤器示例——ex31b.dll、ex31c.exe782
31.9.1选择通知783
31.9.2把事务数据发送到显示程序783
31.9.3显示程序785
31.9.4编译并测试EX31B ISAPI过滤器785
第三十二章ActiveX文档服务器和Internet787
32.1ActiveX文档理论787
32.1.1ActiveX文档服务器和OLE嵌入服务器787
32.1.2从IE3中运行ActiveX文档服务器788
32.1.3ActiveX文档服务器和ActiveX控件789
32.1.4ActiveX文档服务器和包容器的OLE接口790
32.1.5MFC对ActiveX文档服务器的支持790
32.2ActiveX文档服务器示例程序EX32A791
32.2.1EX32A第一阶段——简单的服务器792
32.2.2调试ActiveX文档服务器792
32.2.3EX32A第二阶段——加入WinInet调用792
32.3ActiveX文档服务器示例程序EX32B794
32.3.1在程序控制下产生POST请求799
32.3.2EX32B视图类800
32.3.3编译并测试EX32B802
32.3.4ActiveX文档服务器和VB Script802
32.4进一步使用ActiveX文档服务器803
附录AMicrosoft基本类(MFC)库中的消息映射函数804
附录BMFC库运行时类识型和动态对象创建810