《Microsoft Visual C++ .NET技术内幕 第6版》PDF下载

  • 购买积分:24 如何计算积分?
  • 作  者:(美)George Shepherd,(美)David Kruglinski著;潘爱民译
  • 出 版 社:北京:清华大学出版社
  • 出版年份:2004
  • ISBN:7302089310
  • 页数:920 页
图书介绍:本书是经典的《visual C++ 技术内幕》的最新版,其内容基本反映了现在的技术发展状况,本书讨论了MFC,介绍了当前MFC中的最新用户界面元素,本书也全面讨论了COM和相关的开发支持, 以及Internet程序设计。最后,本书也介绍了Visual C++对于.NET的支持。

1.1 Windows编程模型 3

1.1.1 消息处理 3

目录 3

第1部分 Windows、Visual C++.NET和应用程序框架基础 3

第1章 Windows和Visual C++.NET 3

1.1.2 Windows的图形设备接口(GDI) 4

1.1.6 Win32应用程序编程接口 5

1.1.5 动态连接库(DLL) 5

1.1.3 基于资源的程序设计 5

1.1.4 内存管理 5

1.2.1 Visual C++.NET和创建过程 6

1.2 Visual C++.NET的组成 6

1.2.4 源代码编辑器 9

1.2.3 C/C++编译器 9

1.2.2 资源视图窗口和资源编辑器 9

1.2.7 调试器 10

1.2.6 连接器 10

1.2.5 资源编译器 10

1.2.8 MFC Application Wizard 11

1.2.11 对象浏览器 12

1.2.10 解决方案资源管理器 12

1.2.9 Class View 12

1.2.13 联机帮助 13

1.2.12 UML工具 13

1.2.16 ATL库版本7.0 14

1.2.15 MFC库版本7 14

1.2.14 Windows诊断工具 14

1.2.17 .NET支持 15

2.1 为什么要使用应用程序框架 16

第2章 Microsoft基本类库应用程序框架 16

2.2.1 应用程序框架和类库 20

2.2 什么是应用程序框架 20

2.1.1 学习曲线 20

2.2.2 应用程序框架示例 21

2.4 文档和视图 24

2.3 MFC库消息映射 24

3.1 什么是视图 29

第3章 从MFC Application Wizard开始学习 29

第Ⅱ部分 MFC基础 29

3.4 Ex03a:“不做任何事情”的应用程序 30

3.3 MFC库支持的用户界面 30

3.2 MFC库应用程序的类犁 30

3.5 CEx03aView视图类 34

3.6.2 Windows设备环境 35

3.6.1 OnDraw成员函数 35

3.6 在视图窗口内绘图:Windows GDI 35

3.6.3 向Ex03a程序中添加绘制代码 36

3.7.1 Ex03a.rc的内容 37

3.7 资源编辑器简介 37

3.7.2 运行对话框资源编辑器 38

3.8 Win32 Debug目标和Win32 Release目标 39

3.9 对预编译头文件的理解 40

3.10 两种方法运行程序 42

4.1 向导的类型 43

第4章 Visual C++.NET向导 43

4.2 向导是如何工作的 44

4.3 创建一个向导 45

4.4 创建一个“用托管c++来开发Web应用程序”的向导 46

5.1 获取用户输入——消息映射函数 53

第5章 Windows消息映射 53

5.1.2 保存视图的状态:类的数据成员 54

5.1.1 消息映射 54

5.1.4 使矩形区域无效的理论 55

5.1.3 初始化视图类数据成员 55

5.1.7 判断一个点是否在矩形内 56

5.1.6 CRect,CPoint和CSize类的运算 56

5.1.5 Windows的客户区域 56

5.1.9 判断一个点是否在椭圆内 57

5.1.8 CRect的LPRECT操作符 57

5.1.10 Ex05a示例程序 58

5.1.11 对Ex05a使用Class View 61

5.2 使用Windows映射模式 64

5.2.1 MM_TEXT映射模式 65

5.2.3 “可变比例”映射模式 66

5.2.2 “固定比例”映射模式 66

5.2.4 坐标转换 68

5.2.5 Ex05b示例程序——转换到MM_HIMETRIC映射模式 69

5.3.3 滚动方式的选择 71

5.3.2 滚动条 71

5.3 创建一个滚动视图窗口 71

5.3.1 窗口比您所见到的要大 71

5.3.6 Ex05c示例程序:滚动 72

5.3.5 接收键盘输入 72

5.3.4 OnlnitialUpdate函数 72

5.4.3 WM_QUERYENDSESSION消息 76

5.4.2 WM_CLOSE消息 76

5.4 使用其他Windows消息 76

5.4.1 WM_CREATE消息 76

5.4.5 WM_NCDESTROY消息 77

5.4.4 WM_DESTROY消息 77

6.1 设备环境类 78

第6章 经典的GDI函数、字体和位图 78

6.1.2 构造和析构CDC对象 79

6.1.1 显示设备环境类CClientDC和CWindowDC 79

6.1.4 CPaintDC类 80

6.1.3 设备环境的状态 80

6.2.1 GDI对象的构造与析构 81

6.2 GDI对象 81

6.2.2 跟踪GDl对象 82

6.2.4 GDI选择的有效期 83

6.2.3 库存的GDI对象 83

6.3.1 字体是GDI对象 84

6.3 字体 84

6.3.4 显示字体 85

6.3.3 打印字体 85

6.3.2 选择字体 85

6.3.5 显示器的逻辑英寸和物理英寸 86

6.3.6 计算字符高度 87

6.4 Ex06a示例程序 88

6.4.1 Ex06a程序的组成元素 90

6.5 Ex06b示例程序 91

6.6 Ex06c示例程序——再次使用CScrollView 94

6.5.1 Ex06b程序的组成元素 94

6.6.1 Ex06c程序的组成元素 97

6.7 位图 99

6.6.3 在滚动视图中使用逻辑twips映射模式 99

6.6.2 CScrollView的SetScaleToFitSize模式 99

6.7.1 GDI位图和与设备无关的位图 100

6.8.1 关于调色板编程的术语 101

6.8 DIB和CDib类 101

6.7.2 彩色位图和单色位图 101

6.8.2 DIB、像素和颜色表 102

6.8.3 BMP文件中DIB的结构 103

6.8.5 CDib类 104

6.8.4 DIB访问函数 104

6.8.6 DIB显示性能 110

6.8.7 Ex06d示例程序 111

6.9 进一步使用DIB 113

6.9.1 LoadImage函数 114

6.10 在按钮上放置位图 115

6.9.2 DrawDibDraw函数 115

6.10.1 Ex06e示例程序 116

6.10.2 进一步使用位图按钮 118

7.2 资源和控件 119

7.1 模式和无模式对话框 119

第7章 对话框 119

7.3 模式对话框的编程 120

7.4 包罗万象的对话框——Ex07a示例程序 121

7.4.1 创建对话框资源 122

7.4.2 创建对话框类 127

7.4.3 将对话框与视图相连接 131

7.4.4 深入理解Ex07a应用程序 133

7.5.1 控制OnOK退出过程 134

7.5 Ex07a应用程序的改进 134

7.5.2 OnCancel处理 135

7.5.3 和滚动条控件挂上钩 136

7.6 控件的标识:CWnd指针和控件ID 137

7.7 设置对话框的背景色和其中控件的颜色 138

7.10 Windows通用对话框 139

7.9 利用其他的控件特性 139

7.8 在运行时加入对话框控件 139

7.10.2 从通用对话框类进行派生 140

7.10.1 直接使用CFileDialog类 140

7.10.4 Ex07b示例程序:CFileDialog 141

7.10.3 嵌套对话框 141

7.10.5 CFileDialog的其他可定制特性 146

7.11.2 用户定义的消息 147

7.11.1 创建无模式对话框 147

7.11 无模式对话框的编程 147

7.11.4 Ex07c示例程序:无模式对话框 148

7.11.3 对话框的所有关系(Ownership) 148

8.1 标准通用控件 155

第8章 通用控件 155

8.1.2 滑块控件(Slider Control) 156

8.1.1 进度指示器控件(Progress Control) 156

8.1.5 树状控件 157

8.1.4 列表控件 157

8.1.3 微调控件(Spin Control) 157

8.2 Ex08a示例程序:标准通用控件 158

8.1.6 WM_NOTIFY消息 158

8.3.1 日期时间选择器 171

8.3 高级通用控件 171

8.3.2 月历控件 172

8.3.4 扩展的组合框控件 173

8.3.3 IP地址控件 173

8.4 Ex08b示例程序:高级通用控件 174

9.1 ActiveX控件和普通Windows控件 187

第9章 使用ActiveX控件 187

9.1.3 ActiveX控件与普通控件的不同点:属性和方法 188

9.1.2 ActiveX控件与普通控件的相同点 188

9.1.1 普通的Windows控件:一个参考框架 188

9.2 安装ActiveX控件 189

9.3 日历控件 191

9.4.1 属性访问 192

9.4 ActiveX控件容器编程 192

9.4.2 Visual Studio.NET为ActiveX控件产生的C++包装类 193

9.4.4 Add Class Wizard和容器对话框 196

9.4.3 MFC Application Wizard对ActiveX控件的支持 196

9.5 Ex09a示例程序:ActiveX控件对话框容器 198

9.4.5 把ActiveX控件锁定在内存里 198

9.7 在运行时创建ActiveX控件 206

9.6 ActiveX控件在HTML文件中的使用 206

9.8 Ex09b示例程序:Web浏览器ActiveX控件 207

9.10 可绑定的属性:变化通知 211

9.9 图形属性 211

10.1 进程和内存空间 213

第10章 Win32核心内存管理 213

10.1.1 Windows 95/98进程地址空间 214

10.1.2 Windows NT/2000/XP的进程地址空间 215

10.2 虚拟内存如何工作 216

10.3 VirtualAlloc函数——占用和保留内存 218

10.4 Windows堆和GlobalAlloc函数族 219

10.6 内存映射文件 220

10.5 小内存堆,C++的new和delete操作符,_heapmin 220

10.8 管理动态内存的一些提示 222

10.7 访问资源 222

10.9 常量数据的优化存储 223

11.1.1 单线程程序处理消息的过程 225

11.1 Windows消息处理 225

第11章 Windows消息处理和多线程编程 225

11.1.3 计时器 226

11.1.2 交出控制 226

11.1.4 Ex11a示例程序 227

11.2 空状态处理 230

11.3.1 编写辅助线程函数和启动线程 231

11.3 多线程编程 231

11.3.2 主线程如何与辅助线程通话 232

11.3.3 辅助线程如何与主线程通话 233

11.3.4 Ex11b示例程序 234

11.3.5 用事件使线程同步 235

11.3.6 Ex11c示例程序 236

11.3.8 临界区 238

11.3.7 线程阻塞 238

11.3.10 用户界面线程(UI线程) 240

11.3.9 互斥体(mutex)和信号(semaphore) 240

12.1 主框架窗口和文档类 243

第12章 菜单、键盘加速键、复文本编辑控件和属性表 243

第Ⅲ部分 MFC的文档-视图结构 243

12.2 Windows菜单 244

12.3 键盘加速键 245

12.4 命令处理 246

12.4.2 更新命令用户界面消息控制函数 247

12.4.1 派生类中的命令消息控制 247

12.5 应用程序框架的内置菜单命令 248

12.4.3 对话框发送的命令 248

12.6.1 CEditView类 249

12.6 MFC文本编辑选择 249

12.5.1 菜单命令的启用/禁用 249

12.7 Ex12a示例程序 250

12.6.3 CRichEditCtrl类 250

12.6.2 CRichEditView类 250

12.8.1 创建属性表 256

12.8.2 属性表数据交换 256

12.8 属性表 256

12.9 改进Ex12a示例程序 257

12.10 CMenu类 269

12.9.1 Apply按钮的处理过程 269

12.11 创建浮动的快捷菜单 270

12.12 扩展的命令处理 271

13.1 控制栏和应用程序框架 273

第13章 工具栏和状态栏 273

13.2.2 工具栏按钮的状态 274

13.2.1 工具栏位图 274

13.2 工具栏 274

13.2.3 工具栏和命令消息 275

13.2.4 工具栏更新命令UI消息控制函数 276

13.4 获得主框架窗口 277

13.3 工具提示 277

13.5 Ex13a示例程序:使用工具栏 278

13.6.1 状态栏的定义 282

13.6 状态栏 282

13.6.3 状态指示器 283

13.6.2 信息行 283

13.6.4 对状态栏的控制 284

13.7 Ex13b示例程序:使用状态栏 285

13.8 Rebar 289

13.9 Ex13c示例程序:使用rebar 290

13.8.1 解剖一个reban 290

14.1 为什么可重用基类难以设计 294

第14章 可重用的框架窗口基类 294

14.3 CFrameWnd::ActivateFrame成员函数 295

14.2 CPersistentFrame类 295

14.4 PreCreateWindow成员函数 296

14.5 Windows注册表 297

14.6 使用CString类 299

14.7 最大化窗口的位置 300

14.10 默认窗口矩形 301

14.9 静态数据成员 301

14.8 控制栏状态和注册表 301

14.11 Ex14a示例程序:使用持续框架窗口类 302

14.12 MDI应用程序中的持续框架 307

15.1 文档-视图之间的相互作用函数 308

第15章 文档与视图的分离 308

15.1.2 CDocument::UpdateAllViews函数 309

15.1.1 CView::GetDocument函数 309

15.1.4 CView::OnlnitialUpdate函数 310

15.1.3 CView::OnUpdate函数 310

15.2 最简单的文档-视图应用程序 311

15.1.5 CDocument::OnNewDocument函数 311

15.3 CForm View类 312

15.5.1 TRACE宏 313

15.5 诊断信息转储 313

15.4 CObject类 313

15.5.3 信息转储环境及CObject类 314

15.5.2 afxDump对象 314

15.5.4 未被删除对象的自动信息转储 315

15.6 Ex15a示例程序:简单的文档-视图交互 318

15.7 更加高级的文档-视图交互 324

15.9 CObList集合类 325

15.8 CDocument::DeleteContents函数 325

15.9.1 对先入先出列表使用CObList类 326

15.9.2 在CObList中进行迭代——POSITION变量 327

15.9.3 CTypedPtrList模板集合类 328

15.9.4 信息转储环境及集合类 329

15.10 Ex15b示例程序:一个多视图SDI应用程序 330

15.10.1 资源要求 331

15.10.2 代码要求 332

15.10.4 测试Ex15b应用程序 346

15.10.3 保护类型的虚函数 346

15.11 留给读者的两个练习 347

16.1 什么是序列化 348

第16章 读和写文档 348

16.1.2 使类可序列化 349

16.1.1 磁盘文件和归档(Archives) 349

16.1.3 编写Serialize函数 350

16.1.4 从归档中载入:内嵌对象和指针 351

16.1.6 Serialize函数和应用程序框架 353

16.1.5 使集合序列化 353

16.2.1 Windows应用程序对象 354

16.2 SDI应用程序 354

16.2.2 文档模板类 355

16.2.3 文档模板资源 356

16.2.5 创建空文档:CWinApp::OnFileNew函数 357

16.2.4 SDI文档的多视图 357

16.2.7 连接File/Open与序列化代码:OnFileOpen函数 358

16.2.6 文档类的OnNewDocument函数 358

16.2.9 将File/Save和File/Save As与序列化代码相连接 359

16.2.8 文档类的DeleteContents函数 359

16.3 Ex16a示例程序:支持序列化的SDI程序 360

16.2.10 文档的“脏”标志 360

16.3.2 CEx16aApp 361

16.3.1 CStudent 361

16.3.3 CMainFrame 365

16.3.4 CEx16aDoc类 368

16.4 从Windows资源管理器启动及拖放 370

16.3.6 测试Ex16a应用程序 370

16.3.5 CEx16aView类 370

16.4.2 双击文档 371

16.4.1 程序注册 371

16.5 MDI支持 372

16.4.5 试验用Windows资源管理器启动程序及拖放 372

16.4.3 允许拖放 372

16.4.4 程序启动参数 372

16.5.1 一个典型的具有MFC风格的MDI应用程序 373

16.5.3 MDI文档模板类 374

16.5.2 MDI应用程序对象 374

16.5.4 MDI框架窗口和MDI窗口 375

16.5.5 主框架和文档模板资源 376

16.5.7 为已有的文档创建附加视图 377

16.5.6 创建空文档 377

16.5.9 多文档模板 378

16.5.8 载入和存储文档 378

16.6 Ex16b示例程序:MDI应用程序 379

16.5.10 从Windows资源管理器启动及拖放 379

16.6.1 CEx16bApp 380

16.6.2 CMainFrame 384

16.6.3 CChildFrame 387

16.8 Ex16c示例程序:MTI应用程序 389

16.7 MTI支持 389

16.6.4 测试Ex16b应用程序 389

16.8.1 测试Ex16c应用程序 391

17.1.1 标准打印对话框 392

17.1 基于Windows的打印 392

第17章 打印和打印预览 392

17.1.2 交互选择打印页码 393

17.2 打印预览 394

17.1.3 显示页和打印页 394

17.3.3 准备设备环境:CView::OnPrepareDC函数 395

17.3.2 CView::OnPrint函数 395

17.3 打印机的程序设计 395

17.3.1 打印机设备环境和CView::OnDraw函数 395

17.3.4 打印任务的开始和结束 396

17.4 Ex17a示例程序:一个所见即所得的打印程序 397

17.4.1 读取打印机矩形框 402

17.5 再看模板集合类:CArray类 403

17.6 Ex17b示例程序:多页打印程序 404

18.1 切分窗口 410

第18章 切分窗口和多视图 410

18.3 动态和静态切分窗口 411

18.2 关于视图的选择 411

18.4.1 与切分有关的资源 412

18.4 Ex18a示例程序:具有单个视图类的SDI动态切分 412

18.4.3 测试Ex18a应用程序 413

18.4.2 CMainFrame 413

18.5.1 CHexView 414

18.5 Ex18b示例程序:双视图类SDI静态切分 414

18.5.2 CMainFrame 415

18.6 Ex18c示例程序:切换视图类但不用切分窗口 416

18.5.3 测试Ex18b应用程序 416

18.6.2 CMainFrame 417

18.6.1 资源要求 417

18.6.3 测试Ex18c应用程序 418

18.7.1 资源要求 419

18.7 Ex18d示例程序:多视图类MDI应用程序 419

18.7.3 CMainFrame 420

18.7.2 CEx18dApp 420

18.7.4 测试Ex18d应用程序 421

19.1 WinHelp和HTML Help 423

第19章 上下文相关帮助 423

19.2.1 编写简单的帮助文件 425

19.2.1 复文本格式(RTF) 425

19.2 Windows的WinHelp程序 425

19.3 应用程序框架与WinHelp 430

19.2.3 改进的目录 430

19.3.1 调用WinHelp 431

19.3.4 帮助上下文别名 432

19.3.3 从应用程序的菜单来调用WinHelp 432

19.3.2 使用搜索字符串 432

19.3.5 确定帮助上下文 433

19.3.8 消息框帮助:AfxMessageBox函数 434

19.3.7 Shift+F1 帮助 434

19.3.6 F1帮助 434

19.4 帮助示例:不需要任何编程 435

19.3.9 一般的帮助 435

19.5.1 F1处理过程 437

19.5 帮助命令处理 437

19.6 Ex19b示例程序:帮助命令处理 438

19.5.2 Shift+F1 处理过程 438

19.6.2 CStringView 439

19.6.1 头文件要求 439

19.6.5 帮助文件要求 440

19.6.4 资源要求 440

19.6.3 CHexView 440

19.7 MFC和HTML Help 441

19.6.6 测试Ex19b应用程序 441

19.8 Ex19c示例程序:HTML Help 442

20.1 基本DLL理论 444

第20章 动态链接库 444

20.1.1 导入如何与导出相匹配 445

20.1.3 符号链接和序号链接 446

20.1.2 隐式链接和显式链接 446

20.1.4 DLL入口点:DllMain 447

20.1.6 客户程序如何找到DLL 448

20.1.5 实例句柄:装载资源 448

20.2 MFC DLL:扩展的和常规的 449

20.1.7 调试DLL 449

20.2.2 MFC扩展DLL的资源搜索序列 450

20.2.1 MFC扩展DLL:导出类 450

20.2.3 Ex2Oa示例程序:MFC扩展DLL 451

20.2.4 Ex2Ob示例程序:DLL测试客户程序 453

20.2.7 MFC常规DLL的资源搜索序列 454

20.2.6 使用AFX_MANAGE_STATE宏 454

20.2.5 MFC常规DLL:AFX_EXTENSION_MODULE结构 454

20.2.8 Ex20c示例程序:MFC常规DLL 455

20.2.9 修改Ex2Ob示例程序:加入代码以测试Ex20c.dll 457

20.3.1 什么是自定义控件 458

20.3 自定义控件DLL 458

20.3.3 MFC库和WndProc函数 459

20.3.2 自定义控件的窗口类 459

20.3.5 发送给控件的用户定义消息 460

20.3.4 自定义控件的通知消息 460

20.3.6 Ex2Od示例程序:自定义控件 461

20.3.7 再修改Ex2Ob示例程序:加入代码以测试Ex2Od.dll 466

21.1 Ex21a示例程序:一个基于对话框的应用程序 469

第21章 不带文档或视图类的MFC程序 469

21.1.1 应用程序类的lnitlnstance函数 471

21.1.2 对话框类和程序图标 472

21.2 Ex21b示例程序:一个SDI应用程序 473

21.3 Ex21c示例程序:一个MDI应用程序 475

22.1 ActiveX技术 479

第22章 组件对象模型 479

第Ⅳ部分 C0M、自动化、ActiveX和OLE 479

22.2.1 COM的本质 480

22.2 什么是COM 480

22.2.2 什么是COM接口 481

22.2.3 IUnknown接口和QueryInterface成员函数 485

22.2.4 引用计数:AddRef和Release函数 488

22.2.5 类厂(class factory) 489

22.3 Ex22a示例程序:一个模拟的COM 491

22.2.6 CCmdTarget类 491

22.4.1 COM的CoGetClassObject函数 499

22.4 MFC库中实际的COM 499

22.4.2 COM和Windows注册表 500

22.4.3 运行时对象注册 501

22.4.4 COM客户程序如何调用进程内组件 502

22.4.5 COM客户程序如何调用进程外组件 503

22.4.6 MFC接口宏 505

22.4.8 针对COM进程内组件的向导支持 507

22.4.7 MFC的COleObjectFactory类 507

22.5 Ex22b示例程序:MFC COM进程内组件 509

22.4.9 MFC COM客户程序 509

22.6 Ex22c示例程序:MFC COM客户 514

22.7 包容、聚合和继承 515

23.1 为VBA创建C++组件 517

第23章 自动化 517

23.2.1 Excel:一个比Visual Basic还好的Visual Basic 518

23.2 自动化客户和自动化组件 518

23.2.2 属性(property)、方法(method)和集合(collection) 520

23.3.1 IDispatch接口 521

23.3 自动化接口 521

23.4 自动化程序设计的选择 522

23.4.1 MFC中的IDispatch实现 523

23.5 一个MFC自动化组件 524

23.6 一个MFC自动化客户程序 525

23.7 使用了编译器的#import指令的自动客户程序 527

23.8 VARIANT类型 528

23.9 COleVariant类 530

23.9.1 Invoke的参数和返回值的类型转换 532

23.10.1 Ex23a示例程序:一个不带任何用户界面的自动化组件EXE 534

23.10 自动化示例 534

23.10.2 Ex23b示例程序:自动化组件DLL 542

23.10.3 Ex23c示例程序:一个带用户界面的SDI自动化组件EXE 551

23.10.4 Ex23d示例程序:自动化客户 558

23.10.5 Ex23e示例程序:自动化客户 573

23.11.1 注册类型库 577

23.11 VBA早绑定 577

23.11.3 IDL文件 578

23.11.2 组件如何注册自己的类型库 578

23.11.4 Excel如何使用类型库 579

23.11.6 客户-组件之间的快速连接 580

23.11.5 为什么使用早绑定 580

24.1.1 IDataObject如何增强了标准剪贴板的支持 582

24.1 IDataObiect接口 582

第24章 统一数据传输:剪贴板传输以及OLE拖放 582

24.2.1 FORMATETC 583

24.2 FORMATETC和STGMEDIUM结构 583

24.2.2 STGMEDIUM 584

24.2.3 IDataObject接口成员函数 585

24.3.1 COleDataSource类 586

24.3 MFC对UDT的支持 586

24.2.4 IDataObject的其他成员函数:通报连接(advisory connection) 586

24.3.2 COleDataObject类 587

24.3.3 MFC数据对象剪贴板传输 588

24.4.1 CRectTracker类成员函数 590

24.4 MFC CRectTracker类 590

24.4.2 CRectTracker的矩形坐标转换 591

24.5.1 CMainFrame类 592

24.5 Ex24a示例程序:数据对象剪贴板 592

24.5.3 CEx24aView类 593

24.5.2 CEx24aDoc类 593

24.6.1 传输的源方 600

24.6 MFC的拖放 600

24.6.3 拖放的动作序列 601

24.6.2 传输的目标方 601

24.7.2 CEx24bView类 602

24.7.1 CEx24bDoc类 602

24.7 Ex24b示例程序:OLE拖放 602

25.1 再谈COM 606

第25章 活动模板库介绍 606

25.1.1 核心接口:IVnkown 607

25.2 编写COM代码 609

25.2.1 使用多继承实现COM类 610

25.3 COM基础设施 611

25.3.2 ActiveX、MFC和COM 612

25.3.1 ActiveX、OLE和COM 612

25.4.2 AtlCom.h 613

25.4.1 AtlBase.h 613

25.4 ATL简介 613

25.4.8 StatReg.cpp和StatReg.h 614

25.4.7 AtlWin.cpp和AtlWin.h 614

25.4.3 AtlConv.cpp和AtlConv.h 614

25.4.4 AtlCtl.cpp和AtlCtl.h 614

25.4.5 AtllFace.idl和AtllFace.h 614

25.4.6 Atllmpl.cpp 614

25.5.1 C++模扳 615

25.5 客户端ATL程序设计 615

25.5.2 Smart指针 616

25.5.3 让C++指针具有智能 618

25.5.4 使用Smart指针 619

25.5.5 Smart指钊和COM 620

25.5.7 CComPtrBase类 621

25.5.6 ATL的Smart指针 621

25.5.8 CComPtr类 625

25.5.9 CComQIPtr类 627

25.5.10 ATL Smart指针的问题 629

25.6 服务器端ATL程序设针 630

25.6.1 ATL和COM类 631

25.6.2 ATL Project选项 632

25.6.3 创建一个经典的ATL COM类 633

25.6.4 套间和线程 634

25.6.5 连接点和ISupportErrorlnfo 636

25.6.7 用经典的ATL来实现飞船类 637

25.6.6 自由线程列集器 637

25.6.8 基本的ATL体系结构 638

25.6.10 ATL的IUnknown:CComObjectRootEx 640

25.6.9 管理Vtable膨胀 640

25.6.11 ATL和QueryInterface 643

25.6.12 让飞船动起来 646

25.6.13 在接口中增加方法 648

25.6.14 双接口 649

25.6.15 ATL和IDispatch 650

25.6.16 IMotion和IVisual接口 651

25.6.17 多个双接口 653

25.7 属性化程序设计 654

26.1 什么是ActiveX控件 657

第26章 ATL和ActiveX控件 657

26.2 用ATL编写ActiveX控件 658

26.2.1 创建一个控件 659

26.2.2 ATL的控件结构 663

26.2.3 开发一个控件 668

26.3 创建一个属性化的控件 698

26.3.1 属性化ATL中的控件事件 701

27.1 为什么使用OLE DB 702

第27章 OLE DB模板 702

27.2 OLE DB的基本结构 703

27.3 OLE DB模板的基本结构 704

27.3.1 OLE DB使用者模板的结构 705

27.3.2 OLE DB提供者模板的结构 707

27.4 创建一个OLE DB使用者 712

27.3.3 提供者各部分是怎样协同工作的 712

27.4.1 OLE DB使用者代码的用法 716

27.5 创建一个OLE DB提供者 717

27.5.1 修改提供者代码 724

27.5.2 增强OLE DB提供者 726

27.6 属性化的OLE DB程序设计 727

第28章 Internet基础 733

第Ⅴ部分 Internet程序设计 733

28.1.2 IP 734

28.1.1 网络协议和分层 734

28.1 Internet入门 734

28.1.3 UDP 735

28.1.4 IP地址格式:网络字节顺序 736

28.1.5 TCP 737

28.1.6 DNS 738

28.1.7 HTTP 740

28.1.9 Internet和Intranet 742

28.1.8 FTP 742

28.2.2 网络硬件 743

28.2.1 NTFS和FAT文件系统 743

28.2 建立一个Intranet 743

28.2.4 Intranet主机名和HOSTS文件 744

28.2.3 对Windows进行网络配置 744

28.3.1 同步和异步Winsock程序设计 745

28.3 Winsock程序设计 745

28.2.5 测试Intranet:Ping程序 745

28.2.6 只有一台计算机的Intranet:TCP/IP环回地址 745

28.3.3 阻塞风格的套接字类 746

28.3.2 MFC Winsock类 746

28.3.4 一个简化的HTTP服务器程序 754

28.3.5 一个简化的HTTP客户程序 756

28.4.2 Ex28a服务器结构 758

28.4.1 Ex28a服务器的限制 758

28.4 用CHttpBlockingSocket建立一个Web服务器 758

28.4.3 使用Win32 TransmitFile函数 759

28.4.4 编译和测试Ex28a 760

28.5.2 Ex28a对代理服务器的支持 761

28.5.1 Ex28a Winsock客户 761

28.5 用CHttpBlockingSocket建立一个Web客户 761

28.6.1 WinInet相对于Winsock的优势 762

28.6 WinInet 762

28.5.3 测试Ex28a Winsock客户 762

28.6.2 MFC WinInet类 763

28.6.3 Internet会话状态回调 764

28.6.4 一个简化的WinInet客户程序 766

28.7.3 Ex28a WinInet Client#2:使用OpenURL 767

28.7.2 测试Winlnet Client#1 767

28.7 用MFC WinInet类建立一个web客户 767

28.7.1 Ex28a WinInet Client#1:使用CHttpConnection 767

28.7.4 测试WinInet Client#2 768

28.8 异步Moniker文件 769

28.8.1 Moniker 769

28.8.2 MFC CAsyncMonikerFile类 769

28.8.3 在程序中使用CAsyncMonikerFile类 770

28.8.4 异步moniker文件和WinInet编程 771

第29章 动态HTML简介 772

29.1 DHTML对象模型 773

29.2 Visual C++.NET和DHTML 776

29.3 Ex29a示例程序:MFC和DHTML 777

29.4 Ex29b示例程序:DHTML和MFC 778

29.5 Ex29c示例程序:ATL和DHTML 782

29.6 进一步的信息 784

第30章 ATL Server 785

30.1 IIS 785

30.1.1 Internet服务管理器 786

30.1.2 IIS的安全性 786

30.1.3 IIS目录 788

30.1.4 IIS日志记录 789

30.1.5 测试IIS 789

30.2.1 CGI和ISAPI 790

30.2.2 一个简单的ISAPI服务器扩展GET请求 790

30.2 ISAPI服务器扩展 790

30.2.3 HTML表单:GET和POST 791

30.3 ATL Server简介 793

30.3.1 ATL和ATL Server 793

30.3.2 什么情况下适用ATL Server 794

30.3.3 ATL Server的结构 794

30.4 Ex30a示例程序:一个ATL Server Web站点 800

31.1 Windows组件技术 805

第31章 Microsoft.NET 805

31.1.1 组件技术的一段历史 805

第Ⅵ部分 .NET和远景 805

31.1.2 DLL存在的问题 806

3l.1.3 COM技术 807

31.1.4 COM的优点 807

31.1.5 COM的缺点 808

31.2 公共语言运行时库 809

31.2.1 消除组件的边界 809

31.2.2 一切都是类型 811

31.2.3 公共语言运行时库的类型 812

31.2.4 公共语言规范(CLS) 815

31.2.5 程序集(Assembly) 816

31.2.6 .NET版本管理 818

31.2.7 生存在公共语言运行时库中 819

31.2.8 线程和公共语言运行时库 821

31.2.9 AppDomain 822

31.2.10 互操作性 822

第32章 托管C++ 824

32.1 公共语言运行时库与C++开发人员 824

32.2 为什么使用C++ 825

32.3 托管的C++扩展 826

32.4 Visual C++.NET和托管扩展 828

32.5 Ex32a示例程序:一个托管C++DLL程序集 828

32.5.1 DaysOfTheWeek 833

32.5.4 DotCOMVP、SoftwareDeveloper和Bum 834

32.5.3 IAManagedInterface和IPerson 834

32.5.5 AManagedDelegate 834

32.5.2 AManagedValueStruct和AManagedGcStruct 834

32.5.6 AManagedClass 835

32.6 程序集的用法 835

32.7 Ex32b示例程序:一个托管的客户可执行程序 836

32.8 加入托管扩展支持 839

33.1 Windows Forms 841

33.1.1 Windows Forms的本质 841

第33章 用托管C++进行Windows Forms编程 841

33.1.2 Windows Forms结构 842

33.1.3 一个Windows Forms向导 843

33.1.4 Form类 846

33.1.5 处理事件 847

33.1.6 在窗体中绘制 847

33.2 Windows Forms的不足 866

第34章 用托管C++进行ASP.NET编程 867

34.1 Internet作为开发平台 867

34.2 ASP.NET的演变 868

34.4 ASP.NET的编译模型 870

34.5 Page类 870

34.3 IIS的作用 870

34.5.1 Code-Behind技术 872

34.5.2 Web Forms 875

34.5.3 ActiveX怎么了 879

34.6.1 HtppContext对象 881

34.6.2 HttpApplication对象 881

34.6 HTTP传递路径 881

34.6.3 HttpModule对象 882

34.6.4 HTTPHandler对象 884

34.7 Web服务 887

34.7.1 使用托管C++的Web服务 888

34.7.2 WSDL和ASP.NET 890

34.7.3 调用Web方法 890

第35章 用托管C++进行ADO.NET编程 892

35.1 托管的提供者 892

35.1.1 NET托管提供者 893

35.2 使用托管提供者 894

35.2.1 连接到数据库 894

35.2.2 发出命令 896

35.2.3 通过命令对象使用存储过程 897

35.2.4 使用数据阅读器对象获取数据 898

35.2.5 错误处理 899

35.3 ADO.NET数据集 900

35.3.1 使用数据适配器填充数据集 901

35.3.2 创建内存中的数据集 902

35.3.3 从数据集中导出XML 904

附录A MFC库中的消息映射函数 906

附录8 MFC库运行时类识别和动态对象创建 915