MFC应用程序在.NET框架下的扩展
基本信息
编辑推荐
本书是第一本向MFC开发人员介绍如何在现有MFC应用程序中集成.NET功能以提高开发效率的参考书。Tom Archer详尽地讲解了如何使用.NET基类库(BCL)来补充或增强MFC类,让MFC开发人员可以更高效地刨建更雅致、更健壮的Windows程序。作为Archer品牌的书籍,所有讲授的知识都配备了简单、实用的演示程序,帮助读者巩固对知识的理解。
内容简介回到顶部↑
本书详细介绍了在现有mfc应用程序中综合运用.net框架的技术。全书共分11章,内容包括正则表达式、文件i/o和注册表、数据加密、xml和dom、ado .net数据库、远程处理、事件日志等。为了让读者透彻理解如何运用.net框架来扩展mfc程序,作者为每个知识点配备了演示程序并提供了实用的项目创建指导和大量案例程序。
本书适合于具有mfc编程知识的程序员作为参考书,尤其适合致力于在mfc应用程序中运用.net基类库(bcl)的程序员。
本书适合于具有mfc编程知识的程序员作为参考书,尤其适合致力于在mfc应用程序中运用.net基类库(bcl)的程序员。
作译者回到顶部↑
本书提供作译者介绍
Tom Archer。他是一位著名程序员,也是Archer Consulting Group的主要成员之一,他建立的公司专门在全世界范围内提供培训、管理和项目咨询以及承包编程任务。他是Code Guru的合作创始人,也是Code Project的活跃撰稿人,已出版了10本专著,包括畅销书Inside C#(Microsoft Press,2002该书已经再版)。
Nishant Sivakumar。他是一名微软Visual C++精英,也是CodeProject团队的成员之一。他撰写了100多篇关于Visual C++和.NET编程的文章。
.. << 查看详细
Nishant Sivakumar。他是一名微软Visual C++精英,也是CodeProject团队的成员之一。他撰写了100多篇关于Visual C++和.NET编程的文章。
.. << 查看详细
目录回到顶部↑
第1章 综合运用mfc与托管扩展 1
1.1 引言 1
1.2 编写托管扩展应用程序 2
1.3 编写访问.net的mfc应用程序 8
1.4 混合模式编程问题 11
1.5 运用.net类型 15
1.6 小结 30
第2章 正则表达式 32
2.1 引言 32
2.2 使用regex类来分解字符串 32
2.3 用match和matchcollection类来搜索字符串 39
2.4 处理捕获组和捕获 45
2.5 解析和置换字符串 53
2.6 使用捕获组和替换模式置换匹配 56
2.7 综合运用:编写一个电子邮件解析器 59
2.8 小结 65
第3章 文件i/o和注册表 66
3.1 引言 66
3.2 .net中的流、读取器和写入器 66
3.3 文件系统类 94
1.1 引言 1
1.2 编写托管扩展应用程序 2
1.3 编写访问.net的mfc应用程序 8
1.4 混合模式编程问题 11
1.5 运用.net类型 15
1.6 小结 30
第2章 正则表达式 32
2.1 引言 32
2.2 使用regex类来分解字符串 32
2.3 用match和matchcollection类来搜索字符串 39
2.4 处理捕获组和捕获 45
2.5 解析和置换字符串 53
2.6 使用捕获组和替换模式置换匹配 56
2.7 综合运用:编写一个电子邮件解析器 59
2.8 小结 65
第3章 文件i/o和注册表 66
3.1 引言 66
3.2 .net中的流、读取器和写入器 66
3.3 文件系统类 94
前言回到顶部↑
阅读本书的前提与目标
阅读本书的前提是读者一定要有MFC开发的经验。他们也许没有从事过将代码移植到.NET的工作,但有兴趣了解如何运用.NET让自己的开发效率更高。MFC开发人员往往更喜欢创建用户界面的文档/视图和对话框模型,而且在这种开发环境下,开发效率也将大大提高。另外,MFC开发人员可能拥有大量暂时不愿或不能移植到.NET的源代码。不过,开发人员对一些.NET类及其如何实现甚至替换MFC中的对应类仍然具有浓厚的兴趣。那么,这样的MFC开发人员将从本书获益良多。许多.NET书籍要么笼统地讲解,要么对某些知识只字不提。与之相反,本书考虑到开发人员(尤其是使用C++和MFC的开发人员)只是在.NET框架具有绝对优势的地方才会运用相关技术,因此全书讲解内容非常有针对性。
除此之外,虽然书中详细介绍了不同的.NET类,但这本书不是一本专门介绍.NET类库的参考书。.NET类型和类有上百种,这并非本书的重点。我的目标是有选择地介绍其中一些对MFC开发人员有用的类。例如介绍XML的这一章就是这样安排的。
XML已经成为交换数据的公认标准之一。不过,为了在MFC中使用XML,可能要通过COM(组件对象模型)来运用微软的IE(Internet Explorer)XMLDOM。虽然这是一种解决方案(我曾经撰写过几篇介绍如何实现这一方案的文章),但使用XMLDOM并不能和一流的、强大的.NET XML类集相媲美。所以,本书用一章来专门介绍.NET XML命名空间,内容包括读写XML文件、遍历XML文档以及使用XPath来查询XML数据。
按上述方式,当读者学习完这本书时,将掌握如何在现有的(以及将来的)MFC应用程序中运用.NET基类库(BCL)的强大功能,最终提高开发效率、提高产品质量。
有关技术问题
有些人认为Visual C++ .NET包含两个单独的C++编译器,其中一个针对托管(.NET)代码,另一个针对非托管代码。虽然有时这样理解有一定的帮助,但实际上Visual C++ .NET产品中只包含一个具有两个不同部分的编译器:
· ISO 标准C++:与ISO兼容的C++编译器可以为控制台应用程序、Windows应用程序、Windows服务等项目生成本地(x86)可执行文件和库。真正让人感兴趣的就是这个编译器与MFC类的结合运用。
·托管扩展:这是结合托管C++语法与标准C++代码时可以采用的语言结构。通过托管扩展能够定义和使用托管类型(垃圾回收引用类型、值类型、作用域枚举、委托等),而且可以使用托管运行时工具,例如反映和安全性。
所以,只存在一个编译器,可以将托管扩展视为其他微软C/C++的扩展,如__declspec。但却显然要比其他扩展更广泛,因为托管扩展提供所有的CLI功能:垃圾回收、反映等。甚至可以将托管扩展视为一个超集语言,它包含标准C++作为子集。单个编译器可以生成本地和托管的标准C++代码。那么,由混合代码编写的应用程序又如何呢?让我们看两个混合本地和托管C++代码的技术:COM Interop和IJW(It Just Works)。
实际上有两种COM Interop类型。一种是CCW(COM Callable Wrapper),通过它能够创建"纯"本地化应用程序(无.NET的生成时间依赖性),它通过COM访问.NET代码。另外一种是RCW(Runtime Callable Wrapper),通过它可以从托管应用程序访问本地化代码。因此,我们可以编写MFC应用程序,然后再通过CCW访问不同的.NET类。不过,CCW有许多缺陷,不可避免地会影响它的吸引力。首先,CCW在执行速度上不是很快。其次,CCW不能使用整个CLR类型系统。最后,许多.NET类型不会提供COM,因此访问它们将十分困难,或者根本不可能。
IJW指的是让托管代码调用本地函数、在MSIL中编译非托管类型、在托管类型方式中使用非托管类型和为MSIL提供本地化入口点等机制。不过,IJW不仅仅与调用本地化函数的托管代码有关,它还能为托管函数提供本地化入口,完成在.NET下获取C++代码的所有必要工作。
如果对上面一段内容有些迷惑,这是完全可以理解的。毕竟这段话听起来像是在谈论如何编写使用本地代码的.NET程序,而本书的主题却与之相反,即使用.NET来增强MFC程序。虽然第一印象让人觉得迷惑,但IJW仅仅是针对那些偶尔需要调用本地函数的.NET应用程序而设计的。事实证明,它还适用于90%本地化的.NET应用程序,使之能很好地工作。因此,由于IJW可以完全访问.NET类,而且比CCW更高效,所以本书采用了这一技术。
本书中的约定
所有的程序员都有自己的习惯术语和编码方式。因此,本书对于一些术语采用如下约定:
·"问题域"--我是在几年前使用Coad/Yourdon面向对象分析和设计方法学时接触这一术语的。"问题域"是指要解决的问题集。
·"使用者"和"客户"--这些可互换的术语用于表示使用类或类型的代码。从MFC应用程序的角度也可以看到这一术语,它们充当.NET类库或特定.NET类的使用者或客户。
·"服务器"--这一术语用于指客户或使用者所运用的一段代码,典型的是一个类。
·"形参"和"实参"--当指代传递给方法的值时,我们可交替使用这些术语,就像大部分程序书籍所写的那样。
·"函数"与"方法"--正统的面向对象编程人员会告诉你:应当使用术语"方法",而不要使用"成员函数"。不过,作为具有10年经验的MFC开发人员,我仍然难以将C++函数称为方法。因此,根据本书,可以看到我同时使用了这两个术语。如果是指本地C++代码,我将使用术语"函数",如果是指.NET代码,我将使用术语"方法"。
阅读本书的前提是读者一定要有MFC开发的经验。他们也许没有从事过将代码移植到.NET的工作,但有兴趣了解如何运用.NET让自己的开发效率更高。MFC开发人员往往更喜欢创建用户界面的文档/视图和对话框模型,而且在这种开发环境下,开发效率也将大大提高。另外,MFC开发人员可能拥有大量暂时不愿或不能移植到.NET的源代码。不过,开发人员对一些.NET类及其如何实现甚至替换MFC中的对应类仍然具有浓厚的兴趣。那么,这样的MFC开发人员将从本书获益良多。许多.NET书籍要么笼统地讲解,要么对某些知识只字不提。与之相反,本书考虑到开发人员(尤其是使用C++和MFC的开发人员)只是在.NET框架具有绝对优势的地方才会运用相关技术,因此全书讲解内容非常有针对性。
除此之外,虽然书中详细介绍了不同的.NET类,但这本书不是一本专门介绍.NET类库的参考书。.NET类型和类有上百种,这并非本书的重点。我的目标是有选择地介绍其中一些对MFC开发人员有用的类。例如介绍XML的这一章就是这样安排的。
XML已经成为交换数据的公认标准之一。不过,为了在MFC中使用XML,可能要通过COM(组件对象模型)来运用微软的IE(Internet Explorer)XMLDOM。虽然这是一种解决方案(我曾经撰写过几篇介绍如何实现这一方案的文章),但使用XMLDOM并不能和一流的、强大的.NET XML类集相媲美。所以,本书用一章来专门介绍.NET XML命名空间,内容包括读写XML文件、遍历XML文档以及使用XPath来查询XML数据。
按上述方式,当读者学习完这本书时,将掌握如何在现有的(以及将来的)MFC应用程序中运用.NET基类库(BCL)的强大功能,最终提高开发效率、提高产品质量。
有关技术问题
有些人认为Visual C++ .NET包含两个单独的C++编译器,其中一个针对托管(.NET)代码,另一个针对非托管代码。虽然有时这样理解有一定的帮助,但实际上Visual C++ .NET产品中只包含一个具有两个不同部分的编译器:
· ISO 标准C++:与ISO兼容的C++编译器可以为控制台应用程序、Windows应用程序、Windows服务等项目生成本地(x86)可执行文件和库。真正让人感兴趣的就是这个编译器与MFC类的结合运用。
·托管扩展:这是结合托管C++语法与标准C++代码时可以采用的语言结构。通过托管扩展能够定义和使用托管类型(垃圾回收引用类型、值类型、作用域枚举、委托等),而且可以使用托管运行时工具,例如反映和安全性。
所以,只存在一个编译器,可以将托管扩展视为其他微软C/C++的扩展,如__declspec。但却显然要比其他扩展更广泛,因为托管扩展提供所有的CLI功能:垃圾回收、反映等。甚至可以将托管扩展视为一个超集语言,它包含标准C++作为子集。单个编译器可以生成本地和托管的标准C++代码。那么,由混合代码编写的应用程序又如何呢?让我们看两个混合本地和托管C++代码的技术:COM Interop和IJW(It Just Works)。
实际上有两种COM Interop类型。一种是CCW(COM Callable Wrapper),通过它能够创建"纯"本地化应用程序(无.NET的生成时间依赖性),它通过COM访问.NET代码。另外一种是RCW(Runtime Callable Wrapper),通过它可以从托管应用程序访问本地化代码。因此,我们可以编写MFC应用程序,然后再通过CCW访问不同的.NET类。不过,CCW有许多缺陷,不可避免地会影响它的吸引力。首先,CCW在执行速度上不是很快。其次,CCW不能使用整个CLR类型系统。最后,许多.NET类型不会提供COM,因此访问它们将十分困难,或者根本不可能。
IJW指的是让托管代码调用本地函数、在MSIL中编译非托管类型、在托管类型方式中使用非托管类型和为MSIL提供本地化入口点等机制。不过,IJW不仅仅与调用本地化函数的托管代码有关,它还能为托管函数提供本地化入口,完成在.NET下获取C++代码的所有必要工作。
如果对上面一段内容有些迷惑,这是完全可以理解的。毕竟这段话听起来像是在谈论如何编写使用本地代码的.NET程序,而本书的主题却与之相反,即使用.NET来增强MFC程序。虽然第一印象让人觉得迷惑,但IJW仅仅是针对那些偶尔需要调用本地函数的.NET应用程序而设计的。事实证明,它还适用于90%本地化的.NET应用程序,使之能很好地工作。因此,由于IJW可以完全访问.NET类,而且比CCW更高效,所以本书采用了这一技术。
本书中的约定
所有的程序员都有自己的习惯术语和编码方式。因此,本书对于一些术语采用如下约定:
·"问题域"--我是在几年前使用Coad/Yourdon面向对象分析和设计方法学时接触这一术语的。"问题域"是指要解决的问题集。
·"使用者"和"客户"--这些可互换的术语用于表示使用类或类型的代码。从MFC应用程序的角度也可以看到这一术语,它们充当.NET类库或特定.NET类的使用者或客户。
·"服务器"--这一术语用于指客户或使用者所运用的一段代码,典型的是一个类。
·"形参"和"实参"--当指代传递给方法的值时,我们可交替使用这些术语,就像大部分程序书籍所写的那样。
·"函数"与"方法"--正统的面向对象编程人员会告诉你:应当使用术语"方法",而不要使用"成员函数"。不过,作为具有10年经验的MFC开发人员,我仍然难以将C++函数称为方法。因此,根据本书,可以看到我同时使用了这两个术语。如果是指本地C++代码,我将使用术语"函数",如果是指.NET代码,我将使用术语"方法"。
序言回到顶部↑
“这就是我需要的!”当我开始阅读这本书时,我情不自禁。这是第一本透彻讲解关于Visual C++开发人员如何使用.NET框架,提高编写新MFC应用程序的效率并增强现有程序的书。它非常成功地阐述了如何在MFC应用程序中使用.NETAPI的机制。这本书解释了开发团队称之为IJW(It Just Works)的功能真正发挥作用的地方,以及需要克服的几个缺陷。但是,本书仅用简短的篇幅介绍这些预备知识,然后就直入主题:在浩瀚的.NET框架中选择特定的API集,并解释如何从MFC代码中使用它们。
阅读目录和前几章,读者就可以立即明白,Tom Archer写就此书是基于对技术的深刻理解,在实践项目中的严谨开发以及与优秀团队合作过程中积累的丰富经验。
在本书中,没有长篇大论地介绍内容庞大的.NET框架,也没有局限于从C++或MFC开发人员的角度来解释.NET框架,而是有选择性地介绍.NET框架部分内容,学习这些知识可以立即用于提高开发效率。这些.NET框架功能与Win32、COM或MFC功能相比,具有明显的优势。本书对实际应用进行了深入的探讨,体现了作者的丰富经验。作者对所有相关技术(C++、MFC、Win32、CLR以及.NET框架)的真知灼见流露于字里行间。睿智、贴切的诠释更是相得益彰。
因为WinFX(用于Longhorn操作系统的新APl)是托管API,所以,使用本书介绍的技术将使你开发的MFC应用程序与Longhorn高度兼容。从现在开始使用.NET框架的远程处理、文件访问、加密以及XML技术,不仅能丰富你的经验,而且能更方便地将新的Longhorn功能集成到应用程序中。
设计新Visual C++版本有助于Windows平台上的C++开发人员顺利运用新平台的功能,甚至有助于完成面向.NET和Longhorn的重大转变,这也是我们的开发团队努力实现的方向及我个人的工作目标。另外,本书讲解了如何运用当前产品进行实战。它讲解了如何正确编码,如何使之正常运行,并指出尚未获得理想解决方案的地方。本书分析了运用哪一部分的.NET API有利,哪一部分的API相对于传统方式并无突出优势?对于这样的判断,本书将一一解答。
本书是我日常必备的参考书。我已开始尽情享受本书提供的丰盛大餐,引领Visual C++新技术潮流。我相信,本书也必将成为你的至爱。
Ronald Laeremans
微软公司Visual C++项目组经理
阅读目录和前几章,读者就可以立即明白,Tom Archer写就此书是基于对技术的深刻理解,在实践项目中的严谨开发以及与优秀团队合作过程中积累的丰富经验。
在本书中,没有长篇大论地介绍内容庞大的.NET框架,也没有局限于从C++或MFC开发人员的角度来解释.NET框架,而是有选择性地介绍.NET框架部分内容,学习这些知识可以立即用于提高开发效率。这些.NET框架功能与Win32、COM或MFC功能相比,具有明显的优势。本书对实际应用进行了深入的探讨,体现了作者的丰富经验。作者对所有相关技术(C++、MFC、Win32、CLR以及.NET框架)的真知灼见流露于字里行间。睿智、贴切的诠释更是相得益彰。
因为WinFX(用于Longhorn操作系统的新APl)是托管API,所以,使用本书介绍的技术将使你开发的MFC应用程序与Longhorn高度兼容。从现在开始使用.NET框架的远程处理、文件访问、加密以及XML技术,不仅能丰富你的经验,而且能更方便地将新的Longhorn功能集成到应用程序中。
设计新Visual C++版本有助于Windows平台上的C++开发人员顺利运用新平台的功能,甚至有助于完成面向.NET和Longhorn的重大转变,这也是我们的开发团队努力实现的方向及我个人的工作目标。另外,本书讲解了如何运用当前产品进行实战。它讲解了如何正确编码,如何使之正常运行,并指出尚未获得理想解决方案的地方。本书分析了运用哪一部分的.NET API有利,哪一部分的API相对于传统方式并无突出优势?对于这样的判断,本书将一一解答。
本书是我日常必备的参考书。我已开始尽情享受本书提供的丰盛大餐,引领Visual C++新技术潮流。我相信,本书也必将成为你的至爱。
Ronald Laeremans
微软公司Visual C++项目组经理

点击看大图






加载中...
