第一章Visual C++概述 联系客服

发布时间 : 星期五 文章第一章Visual C++概述更新完毕开始阅读e2434d23bcd126fff7050bc8

第一章Visual C++简介

只要提到在Windows 95和Windows NT下进行32位的应用程序开发,就不能不提到Visual C++。相比其它的编程工具而言,Visual C++在提供可视化的编程方法的同时,也适用于编写直接对系统进行底层操作的程序,其生成代码的质量,也要优于其它的很多开发工具。随Visual C++所提供的Microsoft基础类库(Microsoft FoundationClass Library,简写为MFC),对Windows 95/NT所用的Win32应用程序接口(Win32 Application Programming Interface)进行了十分彻底的封装,这使得可以使用完全的面向对象的方法来进行Windows95/NT应用程序的开发,从而大量的节省了应用程序的开发周期,降低了开发成本,也使得Windows程序员从大量的复杂劳动中解救出来,相信随着对Visual C++了解的逐步深入,你会亲自感受到这一点。Visual C++使Windows编程不再深奥和晦涩,而是一件有意义并且有趣的事情,而且,你并没有因为获得这种方便而牺牲应用程序的性能。

在本章中,我们将讲述: ??Visual C++和MFC历史

??Visual C++ 5.0的不同版本和它们的区别 ??Visual C++ 5.0的新特性

??Visual C++ 5.0集成开发环境的使用

第一节 Visual C++和MFC的历史

Visual C++的核心是Microsoft基础类库,即通常所说的MFC。尽管使用Visual C++进行编程并不一定要使用MFC,使用MFC也不一定就要使用Visual C++,Borland C++的新版本也提供了对MFC的支持,然而事实上,在很多情况下,我们提到Visual C++时指的就是MFC,而提到MFC时指的也就是Visual C++。因此,当你看到关于Visual C++或是MFC的资料时,要知道,在绝大多数情况下,它们都是指同一样东西。

MFC相当彻底的封装了Win32软件开发工具包(Software DevelopmentKit,即通常所说的SDK)中的结构、功能,它为编程者提供了一个应用程序框架,这个应用程序框架为编程者完成了很多Windows编程中的例行性工作,如管理窗口、菜单和对话框,执行基本的输入和输出、使用集合类来保存数据对象等等,并且,MFC使得在程序中使用很多过去很专业、很复杂的编程课题,如ActiveX、OLE、本地数据库和开放式数据库互联(Open Database Connectivity,简写为ODBC)、Windows套接字和Internet应用程序设计等,以及其它的应用程序界面特性,如属性页(也叫标签对话框)、打印和打印预览、浮动的和可定制的工具条变得更加的容易。

早在1989年,Microsoft的程序员们开始试图将C++和面向对象的编程概念应用于Windows编程中,以编写出一个可以使Windows编程更加简便的应用程序框架。他们把这个应用程序框架叫做AFX (AFX这个词来源于Application Framework,但奇怪的是这个词组中并没有包含“X”这个字母)。直到今天,AFX小组早已不存在了,AFX这个名称也于1994年初不再使用,但在Visual C++和MFC中,AFX的影子却随处可见,很多全局函数、结构和宏的标识符都被加上了AFX的前缀。

最初的AFX版本在经过一年的艰苦之后诞生,却未能被大多数Windows程序员所接受。AFX的确是经过了精心的规划和编码,并且,它也提供了对Windows API的高度抽象,建立了全新的面向对象的AFX API,但最要命的是AFX API库根本不兼容于现有的Windows API。由此导致的最严重后果是大量的SDK代码无法移植,而程序员将学习两种完全不同的编程方法。

AFX不得不重新做所有的一切,他们所创建的新的应用程序框架是一套扩展的C++类,它封装和映射了Windows API,这就是MFC的前身。过去的AFX小组也变成了MFC小组。最终,MFC的第一个公开版本于1992年3月随Microsoft C/C++ 7.0 (而不是Visual C++ 1.0)一起推出。那时距Windows 3.1发布尚有好几个月。在MFC 1.0中还没有文档/视结构,但有类CObject和CArchive。在12个月之后,MFC 2.0随Microsoft新的编程工具Visual C++ 1.0一道出炉。与MFC 1.0一样,MFC 2.0仍是16位的,因为32位的Windows NT 3.1直到1993年7月才问世。在MFC 2.0中,增加了对文档/视结构、OLE 1.0、Windows 3.1公用对话框的支持和消息映射等。在Windows NT 3.1面世一个月以后,Microsoft推出了32版本的Visual C++和MFC 2.1,它实际上是MFC2.0的Win32接口。

最后一个16位的Visual C++编译器是1993年12月推出的Visual C++1.5,直到今天,一些为Windows 3.1编写16位应用程序的程序员还在使用这个版本。1994年9月,32位的MFC 3.0伴随着Visual C++ 2.0的一道面市,在今天的计算机图书市场上,还有着的大量的关于VisualC++ 2.0和MFC 3.0的图书出售,因此,你可以想象得出Visual C++2.0所取得的成功和它所产生的影响。并不象你预想的那样,在Visual C++ 5.0中包括的MFC版本不是MFC 5.0,而是MFC 4.21。发展到今天,MFC已发展成一个稳定和涵盖极广的C++类库,为成千上万的Win32程序员所使用。MFC库是可扩展的,它和Windows技术的最新发展到目前为止始终是同步的。并且,MFC类库使用了标准的Windows命名约定和编码格式,所以有经验的Windows SDK程序员很容易过渡到MFC。MFC结合了Windows SDK编程概念和面向对象的程序设计技术,从而具有极大灵活性和易用性。

第二节 Visual C++ 5.0的版本及新特性

Visual C++ 5.0是Microsoft于1997年4月推出的最新的Visual C++编译器,它包括三个版本。各个版本之间的区别如表1.1所示:

表1.1 Visual C++ 5.0的不同版本 版本 特点 学习版 (Learning Edition) 除了代码优化、剖析程序(一种分析程度的运行时行为的开发工具)和到MFC库的静态链接外,Visual C++ 5.0学习版提供了专业版的其它所有功能。学习版的价格要比专业版本低很多,这是为了使希望使用Visual C++5.0来学习C++语言的个人也可以负担得起。但你不可以使用Visual C++ 5.0学习版来开发供发布的软件,其授权协议明确禁止这种做法。 专业版 (Professional Edition) 企业版 (Enterprise Edition)

Visual C++ 5.0可用来开发Win32应用程序、服务和控件。在这些应用程序、服务和控件中可使用由操作系统提供的图形用户界面或控制台API。 可用来开发和调试为Internet或企业内网(intranet)设计的客户-服务器应用程序。在Visual C++ 5.0企业版还包括了开发和调试SQL数据库应用

程序和简化小组开发的开发工具。 第三节 Visual C++ 5.0的新特性

如果你没有使用过Visual C++ 4.x,或者虽然使用过Visual C++4.x,但对它还不是非常之熟悉,那么你可以跳过这一节的内容,继续阅读本书的其它内容。在这一节里列举了Visual C++ 5.0中新增的所有特性,这些内容对熟练掌握了Visual C++ 4.x的程序员来说是很有用处的,他们可以通过阅读本节了解到Visual C++ 5.0所做的改进,从而知道自己应该补充的是哪一方面的内容。而对于Visual C++的初学者和刚入门者来说,了解这些内容就不是那么有必要了,尤其是当你急切地想进入Visual C++ 5.0的编程实践中去的时候。

下面我们分版本来讲述Visual C++ 5.0相对于上一个版本所新增加的内容: (1) 专业版

在Visual C++ 5.0专业版中包括如下的新增特性:

C++语言新增下列C++关键字:bool、explicit、false、mutable、true和typename。

?允许使用__declspec来声明指定的存储类属性是应用于某一类型还是某一类型的一个变量。 编译器、链接器和NMAKE

?编译器添加了对COM的支持,从而简化了使用COM对象的C++客户的开发。为了演示如何使用该特性来支持COM,新增了如表1.2所示的示例程序。

表1.2 为演示编译器对COM的支持而新增的示例程序 示例程序 演示内容 ACDUAL INPROC MFCCALC COMEXCEL COMIDE COMMAIL COMMMAP LABRADOR MFC应用程序中双界面的支持 进程内自动化服务器 使用自动化服务器实现的一个简单计算器 单独运行的自动化客户程序。该程序创建一个新的Microsoft Excel电子表格,并生成饼图。 单独运行的自动化客户程序。该程序自动操纵Microsoft Developer Studio 单独运行的自动化客户程序。该程序为Microsoft Exchange 4.0自动操纵了MAPI 不同COM接口入口映射宏的使用 ATL的使用。该程序实现了一个没有用户界面的EXE服务器 FRETHREAD 使用编译器的COM支持编写多线程客户程序和自由线程服务器 ALLINONE MAC、STL、ATL和COM的使用 ??使用/O1选项编译生成的代码大小将比Visual C++ 4.2版小5%到10%。 ??链接器使用了/FIXED选项来创建更小的供发行的应用程序。因此,在使用剖析程序时,由于需要重定位信息,链接器必须使用/PROFILE和/FIXED:NO选项。这同样适用于其它如BoundsChecker或Purify之类的链接后(post-link)工具。

??新增的/EH编译选项可以更有效的控制C++异常处理。C++同步异常处理允许编译器生成更小的代码,因此它是Visual C++ 5.0新的默认C++异常处理模式。

??对用来控制代码优化所面向的处理器的编译器选项/G3、/G4、/G5、/G6和/GB作了修改。 ??将/GX编译器选项映射为/EHsc。

??允许使用链接器选项/PDBTYPE指定包括调试信息的程序数据库(PDB)。该选项可节省磁盘空间并加快链接 ??在NMAKE中支持批处理规则。

AppWizard

??新的AppWizard可以自动管理基于对话框的应用程序中的对话框类。只需要简单的创建一个基于对话框的应用程序,并选择对自动化的支持,就可以象早期版本的AppWizard一样,得到一个支持基本自动化的基于对话框的应用程序。通过单独的代理类,对话框类也可以通过自动化导出。你可以添加方法和属性来导出对话框中的元素。

??定制的AppWizard可以改变工程创建时的设定。例如,你可以在目标创建之后调整编译器、链接器和查看设定或者添加定制的创建步骤。

MFC

??asynchronous (URL) moniker允许应用程序异步的下载文件和控件属性,以便在任务完成后为其它进程释放系统资源。

??可以在Web浏览器(如Internet Explorer 3.0)或支持ActiveX文档的OLE容器(如Microsoft Office Binder)的整个客户区显示活动的文档。

??Win32 Internet API (WinInet)使Internet成为任意应用程序的一个完整部分并简化了Internet服务,如FTP、HTTP和gopher的访问。

??增加了对DAO 3.5的支持。

??增加了对ODBC 3.0的支持,并对MFC ODBC类作了几个重要的修改。

??COleDateTime成员函数SetDate、SetDateTime、SetTime的返回值从BOOL改变为int。每一个成员函数当COleDateTime对象被正确设置时返回0,否则返回1。该返回值基于DateTimeStatus枚举类型。

??新增示例程序IMAGE。该程序生成一个可以异步下载数据的ActiveX控件。

Active Template Library (ATL) 2.1 C Runtime Library

??ATL 2.1版支持创建既小又快的ActiveX控件。

??新增的函数_itoa、_i64toa和_ui64toa将数据转换为一个以null结尾的字符串。所对应的宽位字符版本为_itow、_i64tow和_ui64tow为_itoa、_i64toa和_ui64toa。

??改善了下列的通用浮点超越函数的性能:pow、sqrt、log、log10、sin、cos、tan、asin、acos、atan。 ??改善了内存移动和内存拷贝函数的性能。

ANSI标准C++库 OLE DB

??Visual C++的标准库遵从1996年9月24日公布的ANSI C++ (X3J16)工作单——ANSI Doc No. X3J16/96-0178 WG21/N0996。该标准于1996年7月在Stockholm会议上制定。

??OLE DB是一组OLE接口,它使应用程序可以以统一的方式访问保存在不同信息源中的数据。这些接口支持适合于数据源的大量数据库功能性,并允许数据源共享其数据。所配套的OLE DB软件开发工具包所提供的一组软件部件、工具和文档可以在开发OLE DB客户和

提供程序提供帮助。

ERRLOOK工具

??ERRLOOK工具可以使用系统错误的值来检索相应的错误消息,其中包括OLE HRESULT。错误值可以通过包括拖放、编辑命令等的多种方法给出。由ERRLOOK所返回的错误消息文本可以复制并粘贴到其它应用程序中。除了以上新增特性外,在VisualC++5.0光盘上的\\DEVSTUDIO\\VC\\SAMPLES目录下还包括了一些新增的示例程序。

(2) 企业版

除包括专业版中的所有特性外,Visual C++ 5.0企业版还包括下列特性以支持企业级应用程序的开发: ??Microsoft Transaction Server (Microsoft事务服务器)用于创建基于事务的应用程序。 ??Visual Database Tools (可视化数据库工具)提供了数据库和SQL查询的图形化设计。 ??调试数据库连接时具有更好的性能,该进程将比过去快上很多。

??扩展的SQL数据类型支持使你可以方便的将本地变量变为除text和image外的所有SQL数据类型。这种变换包括money类型和datetime类型。可以在本地变量和NULL值之间相互变换。还可以方便的查看包括text和image在内的所有SQL数据类型。 ??在光盘上的\\DEVSTUDIO\\VC\\SAMPLES目录下包括了特定于企业的版的新增示例程序。

(3) 学习版

Visual C++ 5.0学习版包括了学习C/C++和使用MFC、OLE、ODBC、DAO、ActiveX和COM的各种工具,但不包括下面的特性: ??到MFC的静态链接

使用Visual C++ 5.0学习版编写的应用程序只能在运行时链接到MFC动态链接库。 ??代码优化

不能使用/O选项来生成更小和更快的代码。 ??程序剖析

不能使用剖析程序来分析程序代码中的某一部分是否可以从性能改进中获益。 ??RemoteData控件及其它的数据绑定控件

除了上面的内容外,Visual C++ 5.0学习版包括专业版中的其它新特性。

(4) 集成开发环境

Microsoft Developer Studio用于Visual J++ 1.1、Visual InterDev、Visual C++ 5.0和MSDN。新的Developer Studio包括以下的新特性:

??自动化和宏

可以使用Visual Basic脚本来自动操纵例行的和重复的任务。可以将Visual Studio及其组件当作对象来操纵,还可以使用Developer Studio对象模型创建集成的附加程序。 ??ClassView

使用文件夹来组织C++和Java中的类,包括使用MFC、ATL创建或自定义的新类。 ??可定制的工具条和菜单

??连接到正在运行的程序并对其进行调试,还可以使用宏语言来自动操作调试器。 ??可以在Developer Studio中查看Internet上的World Wide Web页。 ??可以在一个工作空间中包括多个不同类型的工程

工作空间文件使用扩展名.dsw来代替过去的扩展名.mdp,工程文件使用扩展名.dsp来代替过去的扩展名.mak。 ??改进的资源编辑器

在Visual C++中,可以使用WizardBar来将代码与程序中的可视元素挂钩;

快捷键、二进制、对话框和字符串编辑器支持定位至快捷键、ASCII字符串、十六进制字节串、控件ID和标签及指定字符串的Find命令;

更方便的一次修改多个项(可以快捷键、对话框、菜单和字符串)的属性。 ??改进的文本编辑器

可以使用正确的句法颜色设置来显示无扩展名的头文件。

可以定制选定页边距的颜色来更好的区分同一源代码窗口中的控件和文本区域。 Find in Files命令支持两个单独的窗格。 ??上下文相关的What’s This帮助 ??改进了的WizardBar 可用于Visual J++。 ??新增的向导

添加了集成到Visual J++和Visual InterDev中的新增向导。

第四节 Developer Studio的使用

在一整套的Visual Studio 97中,Visual C++ 5.0、Visual J++ 1.1和Visual InterDev都使用同一个开发环境,称作

DeveloperStudio。你将在Developer Studio中创建所开发的应用程序的源文件、各种资源文件及其它文档。这些文件以工作空间和工程的形式进行组织。Developer Studio中一次只能打开一个工作空间,在同一个工作空间中可以包括多个工程,一般来说,每一个工程你所开发的一个应用程序。这些工程相互之间可以具有某个联系和从属关系,也可以彼此完全独立。此外,这些工程还可以是不同类型的,比如说,你可以在一个已经包括有一个Visual C++工程的工作空间中添加一个Visual J++或是Visual InterDev工程。工程中除了包括了应用程序所用到的源文件、资源文件外,还可以包括其它类型的文件,如应用程序的规格说明书、流程图、开发日程等等。对于那些由ActiveX部件(如Microsoft Word等)所创建的ActiveX文档,可以在DeveloperStudio中直接打开。而对于那些与其它类型的应用程序相关联的文档,你也可以通过Developer Studio在独立的窗口的打开。

Developer Studio所包括的内容是很丰富的。本节只讲述一些基本的概念和用法。这些用法是进行下一步所不可缺少的。对一些特殊的用法,我们将在本书后面的章节中需要用于再作说明。

由于本书假定你已经是一个熟练的Windows 95/NT用户,因此,安装Visual C++的过程对于你来说应该是一个相对很容易的事,所以我们不再在这个问题上浪费时间。下面的过程中,我们假定你已在你的计算机中安装上了Visual C++ 5.0,在一般情况下,这同时也安装了Developer Studio,并以它作为Visual C++ 5.0的集成开发环境。

这时,从你的开始菜单中运行Visual C++ 5.0,屏幕显示应该如图1.1所示。图1.1还标注了Developer Studio中的几个常提到的部件的名称,以使得,当以后我们提到这些名词时,你可以知道它们所指的是Developer Studio中的哪一部分。

图1.1 Microsoft Developer Studio - Visual C++ 5.0的集成开发环境

当然,你所看到的内容和工具条等也许会有少许的不同,这取决于你的设置。下面我们来讲述其中的主要部分。我们看到,在DeveloperStudio,整个窗口被分成了若干个部分,需要注意的事,随着设置的不同,或者所安装的软件包的不同,或者是处于开发的不同阶段(典型地,在输入源代码和调试程序的两个不同阶段),你所见到的Developer Studio组件和相互之间的位置也会不一样。

前面说到过,在Developer Studio中,我们是以工作空间(workspace)和工程(project)来组织文件和进行工作的。工作空间位于这个结构的最顶层,因此,我们首先需要创建一个工作空间。创建工作空间通常有两种方法:

第一种方法是显式的创建一个空白的工作空间,然而向工作空间中添加工程。这时,我们从Developer Studio的File菜单下选择New...命令,这时出现如图1.2所示的对话框。

这时我们在Workspace name处键入工作空间的名字,这里假设为WorkSpc,则Developer Studio将在Location所指定的目录下创建名为WorkSpc的子目录(当在Workspace name处键入完工作空间名后,可以在Location处修改这个默认设置),然后以WorkSpc.dsw的文件名将该工作空间保存到这个目录下。

第二种创建工作空间的办法时直接创建一个工程。创建一个新的工程同样是选择File菜单下的New...命令,在类似于图1.2的对话框中单击Project选项卡,如图1.3所示。然后在该对话框中选择Create newworkspace单选钮(这是Developer Studio的默认选项)。注意在图1.3所示的对话框中,Project name和Location的意义和图1.2中的Worksapce name和Location的意义类似。这样,在创建工程时,Developer Studio将创建一个同名的工作空间。然后将所创建的工程添加到该工作空间中。

图1.2 创建空白工作空间

如果仅在工作空间中包括一个工程的话,使用第二种方式显然是很合理的,并且,也要比使用第一种方式创建空白工作空间,然后再在空白工作空间中添加工程的方法要简洁和方便。在今后的很多情况下,我们都将使用第二种方式来创建工程和包括工程的工作空间。但并不是说第一种方式就没有用处了。事实上,在第二种方法中,Developer Studio将工作空间和工程保存到Location所指定的同一个目录下,这对于单个工程的工作空间是合理的。但如果你希望在工作空间中包括多于一个的工程的话,你也许希望在保存工作空间的目录下新建子目录来保存这些工程,因为这样更有条理,更利于文件的管理。这时,我们就需要使用第一种方式来创建空白工作空间,然后再在这个工作空间中新建和添加工程。

在工作空间中新建工程的方法和上面的第二种方式几乎一样。只不过这时我们应该在图1.3所示的对话框中选择Add to

currentworkspace (在图1.3中,这个单选钮是灰的,这是因为当前并没有打开的工作空间的缘故)。要注意这时Location处的目录名是基于当前工作空间所在的目录的。单击OK后,Developer Studio根据在Project name处所键入的工程名以.dsp的扩展名来保存该工程文件。