Professional Documents
Culture Documents
目 录
第一章: 认识 CodeWarrior
第二章: 工程和目标文件的显示和定制
第三章: 编译
第四章: 链接
第五章: 调试
第六章: 定制
第七章: 库函数和 Microsoft Foundation Classes (MFC)
上海天马
第一章 认识 CodeWarrior
4).CodeWarrior工具条介绍:
4.1).文件菜单: 4.2).编辑菜单
上海天马
第一章 认识 CodeWarrior
4.3).查看菜单 4.5).工程菜单
4.4).查找菜单
上海天马
第一章 认识 CodeWarrior
4.6).调试菜单 4.7).VCS菜单
4.8).窗口菜单
4.9).帮助菜单
上海天马
第一章 认识 CodeWarrior
5).CodeWarrior 集成开发环境的设置
上海天马
第一章 认识 CodeWarrior
5.1).通用设置
5.5.1).编译设置(Build Settings): 选择是否在执行编译之前保存已打开的源
文件,以及有多少内存被用于编译工作;
5.5.2). IDE 之外(IDE Extras): 几个独立的设置.比如指定 CodeWarrior 是否
使用一个第三方的文本编辑器——因为集成的编辑器并不是很完美,这可以通
过指定一个你惯用的编辑器来替代它;
上海天马
第一章 认识 CodeWarrior
5.2).编辑器设置
5.2.1).编辑器设置(Editor Settings): 几个用于定制编辑器显示、管理文本和
窗口的设置项;
上海天马
第一章 认识 CodeWarrior
5.3).调试器设置
5.3.1).显示设置(Display Settings): 几个用于定制调试器显示的设置项;
上海天马
第一章 认识 CodeWarrior
5.3.2).视窗化(Windowing): 设定调试器如何管理它的窗口(比如隐藏所有打开
的编辑器窗口);
上海天马
第一章 认识 CodeWarrior
2.1).工程窗口
当你启动 CodeWarrior 后,打开file,选择new,进入如下工程窗口界面.
上海天马
第二章: 工程和目标文件的显示和定制
工程窗口用于管理整个工程的所有文件以及这个工程将要产生的目标(targets)文件。 Ⅰ). 一
个工程包含了足够的信息来编译一个或多个目标文件。
所谓的目标(target)文件就是当你编译程序时,由 CodeWariior 创建出来的(通常是)一个应用
程序或库文件。一些程序可以编译产生多个目标文件。
比如,你可以编写一个程序来创建一个 DLL 和一个调用该 DLL的主应用程序。在
CodeWarrior 的工程中,你可以定义一个目标来产生 DLL,定义另一个目标来产生应用程序。通
过这种方式,你的工程只需编译一次就可产生所有需要的目标文件或片断。
上海天马
第二章: 工程和目标文件的显示和定制
在窗口的顶端有三个标签(tab)页:文件标签(如图2-2显示)、链接顺序标签页和目
标文件标签页(后两个标签页将在后续课程中讲述)。在这几个标签页的上方,有一
个用于选择要编译的目标文件的下拉菜单。在本例中,我们选择的是 Hello World
工程的调试版本。在下拉菜单的右边有几个图标,它们的存在允许你不必使用菜单
命令就可以方便地编译、链接和运行这个工程。
顾名思义,文件标签页列出了在工程中所有可能用到的文件。你可以通过创建一些
组(用文件夹图标表示)来分门别类地管理这些文件,并可以帮助你方便地了解哪些
文件将被使用。在本例中,我们将 C 程序(以.c为后缀名的文件)全都放到一个叫做
Source 的组中,同时将库文件放到另一个组中,以便整洁明了地管理这些文件。
上海天马
第二章: 工程和目标文件的显示和定制
该程序的源代码:
#include
void main(void) {
int c;
printf("Hello World on Windows!\n");
c = getchar();
}
关于getchar()函数
字符输入函数 getchar() 用在这里是什么意思呢?通常,当一个应用程序执行完毕后,
它就会终止,然后操作系统就会立即清除该应用程序输出.这样,当上述应用程序显示
完“Hello World on Windows!”后,为了避免系统立即将该程序地输出清除,我们在程
序中添加了一个 getchar() 函数,使程序在此处暂停,直到有键盘输入时整个程序会
终止.这样我们才有足够的时间来看清楚该程序的输出.
这是一个正常的操作,而不是一个 bug.实际上,CodeWarrior也提供了一个适用于此
处的库函数,这个库函数中的 C 控制台 I/O 函数步不仅可以在程序显示完毕后锁定
应用程序,而且还可以让你将输出的文本信息存储到一个文件中去.
上海天马
第三章: 编 译
第一步:理解编译阶段
我们的前面的课程中已经学到,源程序输入完之后的工作就是要编译它。编译源程序就是计
算机把你所写(通常是用C 或 C++编写的)的源代码进行分解、分析,然后转化为机器语言。
机器语言是一种计算机能够理解阿语言,而且它运行起来比 C 或 C++ 也要快得多。编译的
大致过程如下:
1. 用 C 或 C++ 编写代码:
#include
void main(void) {
int c;
printf("Hello World on Windows!\n");
c = getchar();
}
2. 进行编译。 CodeWarrior 编译上述代码并把它翻译成机器语言,结果如下:
符号名:
1: _main 2: _@8 3: _printf 4: ___files 5: _fwide 6: ___get_char
=======================================================
========
SECTION SIZE = 0x0000003C; NAME =?.text DEFINED SYMBOLS: name = _main offset =
0x00000000; type = 0x0020; class = 0x0002 00000000: 68 00 00 00 00 push offset _@8
00000005: E8 00 00 00 00 call _printf 0000000A: 59 pop ecx 0000000B: 6A FF push -1
0000000D: 68 00 00 00 00 push offset ___files 00000012: E8 00 00 00 00 call _fwide
00000017: 85 C0 test eax,eax 00000019: 59 pop ecx 0000001A: 59 pop ecx 0000001B: 7D
上海天马
第三章: 编 译
CodeWarrior 中编译选项的详细设置
在正式开始编译源代码之前,CodeWarrior 还要对其做预处理。在这个阶段,是对 C 或 C++
代码进行编译前的一些准备工作。在编写程序的过程中,往往会有很多相同的P代码输入,于
是程序员使用一些快捷方式,比如所谓的宏(macros)来代替这些相同的输入。例如,你可以
使用 APPNAME 作为一个宏,来表示“Metrowerks CodeWarrior”,以此来减少输入的工作量。
预处理就是要把这些宏转换为它们实际表示的代码,此外还要替换一些定义符号(比如
#define THREE 3)为实际的源代码。为了更好地理解预处理所做的工作,你可以查看一下预
处理结果的清单。首先在工程窗口中选中一个源文件,然后从工程菜单中选择预处理项,你
就可以看到源代码进行了预处理之后,编译之前的结果清单了.
定制 CodeWarrior 的编译方式
在第二章中,我们已经了解了一些控制 CodeWarrior 编译代码的选项对话框。现在我们再来
详细地看看一些标准 C 和 C++ 编译器的设置。请你按照下面所学内容在你的 CodeWarrior
上进行实际的操作练习。
上海天马
第三章: 编 译
第二步:连接程序各部件
当你的程序编译完毕以后,接着就要使用连接器来把这些组成你的程序的各个文件连接起来。
连接器是用来组合各个源文件被编译后得到编译代码的,同时还要将这些文件与它们所需要
的库连接在一起。连接确保了每片代码都知道如何去找到你程序中的其它元素。例如,连接
器修改机器代码以便使用MSL 库函数中的 printf() (该函数用来实现功能强大的控制台输入/
输出)来替换你在源文件中使用的 printf()函数调用。
当你编写一个程序时,常常将代码写成函数并存放在不同的文件中,然后将这些文件编译得
到单个的输出文件。就像我们在前面使用的 Hello World 这个程序,它的输出文件是一个应
用程序。但是在某些时候,同一个程序中使用的函数在输出时不一定是存放在同一个输出文
件中的。例如,假设你编写一个应用程序时,其中包含了许多被程序的多个部分重复使用的
代码,你就可以将这些被重复使用的代码编译成为一个可共享的动态链接库(DLL)。这样,该
应用程序仍然可以访问到这些代码,但是它就需要弄明白应该到哪个文件以及如何找到这些
它需要使用的函数。这种情况,就需要做一些连接的工作了。
连接的类型在程序的编制中,一个连接就是一个指针,指向一个象编译函数这样的对象,或
者指向一个变量或一个数组这样的数据内容。连接有两种方式:硬连接(hard linking)和软连
接(soft linking)。
硬连接发生于连接过程中,说明代码的时候。换句话说,如果一个函数被使用了,在连接时
连接器确切地知道这个函数在哪里并创建一个连接把这个函数连接起来。
软连接(也称为弱连接)发生于进行连接时,一些代码可以不需要进行说明,因为你知道这些
代码位于一个DLL 中,并在运行时可以从该 DLL 中进行调用。在这种情况下,连接器会告诉
应用程序到哪里去找它所需要的代码。
软连接也是计算机操作系统中许多元素使用的方法。接下来,我们一起来学习一些关于连接
器的选项设置。
上海天马
第四章 连 接
通过选择编辑菜单中的“工程名”项来打开这个设置窗口。(“工程名”是指当前的活动工程——在本例中
就是 Hello World x86),然后点击设置窗口中的 x86 连接器(或类似的名字)标签。
下面我们来看看一些连接器设置项:
入口点用法(Entry Point Usage): 在 Windows OS 体系中,每一个代码模块都有许多可能可以或者不
可以选择的入口点,这取决于你所编译的代码类型。这些入口点的自然属性依赖于你正在编写的程序
的输出文件(应用程序、库或 DLL )的类型和其它的一些因素。当一个应用程序需要调用一个 DLL 函
数时,主机操作系统就使用这个入口点信息来正确地调用该 DLL 地初始化函数。大多数情况下,你
应当设置此选项为默认方式(如图4-1所示)。这将让 CodeWarrior 根据你在目标文件设置面板中选择
的目标文件类型,来自动地为输出文件设置正确的入口点;
子系统(Subsystem): 子系统有三种选择:Native、 Windows CUI 和 Windows GUI。Native 选项是
用于开发驱动程序和其它异种系统模块的; Windows CUI 选项是用于开发使用控制台风格用户界面
( console-style user interface,所谓的CUI )的应用程序的;Windows GUI 选项用于开发使用
Windows 图形用户界面(Windows graphic user interface,所谓的 GUI )的应用程序的。因为我们是
用的示例程序是简单的基于控制台的 Windows 应用程序,所以我们选择了 CUI 子系统。通常情况
下,CodeWarrior 会根据你在开始创建工程时选择的工程模板来自动地设置子系统的选项;
子系统 ID/用户 ID(Subsystem ID/UserID): 和子系统项一样,这个选项也是由 CodeWarrior 自动
设置的。具体系统对应的 ID 为:Windows 3.1,Windows 95 和 Windows NT 3.5 的 ID 为 3.10,
Windows NT 4 的 ID 为 4.00;
生成连接映射(Generate Link Map): 这个选项允许你生成一个文本文件,其中包含了程序中使用到的
所有的类和函数的详细信息。当需要通过匹配变量或函数名的地址来调试代码时,这个选项就非常有
用了;
生成 SYM 文件(Generate SYM File): 这个选项允许你在连接过程中生成一个符号文件。大多数的调
试器在进行调试时需要一个符号文件来逐步调试你的源代码。我们将在第五课中详细讨论这个内容。
此外,你还可以通过选中生成 CV 信息项(Generate CV Info item)来生成一个可用于 CodeView 的符
号文件。CodeView 是一个流行的 Windows 调试工具;
上海天马
第四章 连 接
关于调试
Purging pesky pests proves productive for programmers!
调试就是在你的程序代码中找到一个问题并着手去解决它的过程。不管是谁,在编程时都难
免出现一些输入或程序逻辑上的错误,一旦出现这种问题,很可能你想破了头也找不到错误
在哪。这个问题可能只是一个输入上的小错误或者只是一个变量用错了,因此你很难发现它。
但是因为这个错误的存在使得你的程序无法实现预期的功能。有时候会更糟糕,以致你的机
器都崩溃了。这时,你就必须借助调试来解决问题。
CodeWarrior 带有一个集成的调试器,可以让你在 CodeWarrior 主窗口中打开一个窗口来进
行调试工作。使用调试器的方法是,从工程菜单中选择 Enable Debugger 项,然后重新编译
你的目标文件。完成上述步骤后,你的程序就会在调试窗口中运行,此时你就可以隔离并改
正你找到的任何一个问题了。
通常进行调试时总要生成源程序的一个调试目标文件。该目标文件的源文件保持不变,但是
需要预先设置置一些选项才能产生该程序的调试版本。通过点击工程窗口的弹出菜单中的调
试目标文件,你就可以进入调试状态。
上海天马
第五章 调 试
上海天马
第五章 调 试
图 5-1 所示的调试窗口包含三个主要部分:
栈窗格(The Stack pane):位于左上方的窗格是显示调用栈(也叫做调用栈的记录)的区
域。当你在单步调试源码的过程中调用了多个函数时,在这个区域就显示出调试到达当前状
态之前调用过的函数名清单。这个清单会随着你的调试过程,根据你是否转入函数内部的情
况随时增减;
变量窗格(The Variables pane): 位于右上方的窗格是显示变量名和其值的区域。其中显
示的是各个变量的名字和它们的值,而且还可以依据变量的类型让你查看(或修改)这些数据。
在图5-1中显示的Hello World x86 程序这个例子中,有四个变量:c,i,x 和 y。当你在代码
中执行单步调试时,这些变量的值就会根据程序执行的过程实时地更新。例如,在调试过程
中,你可以注意到后三个变量是如何取得它们的值的(这些值是在循环代码中赋给这些变量
的),而变量 c 显示的是一个无意义的值(因为你还没有给 getchar() 输入任何值)。你可以使
用这个窗格来发现不正常的变量值,从而发现程序设计上的错误这对于程序的调试成功,非
常关键;
源代码窗格(The Source pane):位于下方的窗格显示了 Hello World x86 这个程序的 C
语言源代码,它也可以用来显示该代码的汇编语言版本。随着调试的深入进行,仅仅是程序
的 C 语言代码可能不能提供足够的调试信息,这是你就需要查看该程序的汇编语言代码。你
可以通过该窗口下端的弹出菜单来选择查看程序的源代码、汇编代码或者两者的混合显示。
你可能已经注意到在源代码窗格左边的红色停止标记,该标记表示这是一个断点,它用于告
诉调试器在此处停止执行程序。此功能可以帮助你很方便地快速到达程序中地某一位置,然
后从此位置处开始调试程序。
当你设置了一个断点,调试器运行到断点所在的行就停止下来,等待你的控制命令。在某行
程序左边显示的蓝色小箭头是当前程序的计数器,它表示指向的程序行为即将要执行到的语
句。在图5-1中,我们已经设置了一个断点以便程序执行到完源代码中的循环块后在第二个输
出语句前停下来。设置断点的操作也很简单,只需在你希望调试器停止的程序行的左端点一
下鼠标即可。
上海天马
第五章 调 试
设置显示面板(见图5-2)包含了一些决定调试器窗口上如何显示信息的参数设置。当你刚开始
使用调试器时,你可以在这里把调试器窗口上的某些文字设置得大一些或小一些,或者用一
些特殊的颜色来显示它们。
颜色设置允许你选择在源代码中用于突显观察点(watchpoints)和变量名的文字颜色。这种设
置非常有用,可以帮助你在调试代码时很容易地观察到观察点或变量值的变化。观察点可用
来帮助你在整个程序中跟踪某个值并将其显示在一个窗口中。
其它设置的用途都解释得很明白了,你也不需要去更它们,默认设计就可以了。当你对调试
器了解得更多了一些时,你才可能会的想去修改这些设置。
关于视窗的设置
上海天马
第五章 调 试
在调试程序的过程中,你会发现桌面上很会就挤满了许多打开的窗口。关于视窗的设置(见图
5-3)允许你设定在调试中隐藏或显示某些特定的窗口来管理这些窗口。默认的设置是隐藏非
调试用的窗口,这在大多数情况下就可以了,不必修改它。
全局设置
全局设置窗格(如图5-4所示)包含了一些用于控制调试器操作方式的选项
上海天马
第五章 调 试
调试过程中缓存修改后的文件这一设置是用于决定修改后的文件需要缓存多长时间用的。缓
存文件能够提高调试器的速度,但是要牺牲一些磁盘空间。
其余的设置解释得很清楚了。如果你只是一个初学者,那么默认设置就可以了。
远程连接
上海天马
第五章 调 试
调试器设置
重定位后的库...的位置(Location of Relocated Libraries, etc): 如果你正在调试的文件被移到其它
位置了,或者你正在通过一个 TCP/IP 网络来进行远程调试,你就必须将这些文件所在的目录输入到这个
文本框中;
在应用程序启动时在临时断点处停止(Stop at temp breakpoint on application launch): 默认情况
下,这个选项在程序的起始位置中断调试器的运行。但你也可以设置为可在任何断点处中断;
自动查找目标库(Auto-target Libraries): 选中这个选项可以自动地访问库。此选项用于正在调试的
代码是一个库的一部分时,当你调试这些代码时,调试器将“做应做的事”(例如装载库并调用任何初始
化函数);
记录系统消息(Log System Messages): 这个选项用于强制将所有的系统消息写入一个记录文件中。
当你遇到代码导致系统崩溃,并因系统崩溃又看不到屏幕显示时,就很有用了。当你重启机器后,你
可以从记录文件中查看导致系统崩溃的消息。特别是今后你调试一些大型程序时,记录文件就很有用
了,所以一定要学会读懂记录文件!
数据更新时间间隔(Data Update Interval): 选中这个选项并给它设置一个值,这样你就可以决定数
据查看(data view)多长时间更新一次。数据查看更新得越频繁,调试器显示的数据值就越新;
缓存运行中的符号文件(Cache symbolics between runs): 在调试器运行时,符号文件(在编译过程
中产生的一种文件)将被缓存起来。这可以提高调试的进程;
在观察点处停止(Stop at Watchpoints): 选中此项,当观察点值为真时就中断调试。观察点和断点一
样是很有用的。不同的是,断点每次都是在一个特定的代码行处停止下来,而观察点是监视一个变量
或内存的一块区域,当此被观察的对象发生改变时,它就中断调试过程。这和 VC 中的条件断点相
似,都是在设定的条件被满足时中断调试过程的。这是一个很有用的调试工具。
上海天马
第五章 调 试
x86 异常(Exceptions)
上海天马
第五章 调 试
概述
这将是最简单的一课,但它却能够帮助帮助你更好地组织你的思想和开展工作。
正如我们在第一课中学到的,可以有许多中方式来为手头某个特定的任务定制 CodeWarrior。
你可以定制 CodeWarrior 的外观和许多设置项,以便使得编译、连接和调试你的程序变得更快、
更简单。
下面我们来看看可用于帮助你更有效地使用 CodeWarrior 的定制选项。因为定制
CodeWarrior 会改变 IDE 的所有行为,所以我们可以想到在编辑菜单下找到这些设置项。在那儿
你将找到选择、命令和键绑定(Key Bindings)等菜单。点击其中的命令项就会显示定制 IDE 命令
设置的窗口。定制 IDE 命令的面板包含两个主标签页。命令标签页允许你很容易的定制出现在每
个 CodeWarrior 菜单中的命令。通过该标签页你也可以修改在内置的文本编辑器中使用的命令,
例如选择文本和移动光标等命令。在这个设置窗口中,你还可以创建任何用于触发某个菜单命令
项的组合键(也称之为键绑定——key binding),以此来启动一个应用程序,或者执行一个脚本。当
然,你也可以设定一个某个命令项是否出现在一个菜单中。
定制 IDE 命令的面板中的另一个标签页是工具条项目标签页,在这个标签页中你可以看到在
CodeWarrior 的工具条中显示的项目,例如显示在每个文本编辑器窗口上方(或下方,取决于你的
参数设置)。
在工具条项目标签页中,你只需点击一个工具条图标然后把它拖到主菜单下面的工具条或者
文本编辑器窗口的工具条中,就可以往相应的工具条中增加一个命令。还可以把工具条中的一个
图标拉到工具条的最后。从 CodeWarrior 的窗口菜单中的工具条子菜单中选择重设窗口的工具条
(Reset Window Toolbar) 或重设浮动工具条菜单项,还可以重新设置该工具条。
上海天马
第六章 定 制
在大多数情况下,CodeWarrior 的默认设置就可以满足你的要求了。偶尔你也可能发现一个
通过改变一个菜单或工具条的方式来自动完成一些任务。关于 Codewarrior 的定制,你可以参考
它的在线文档获得更多的信息。
CodeWarrior 定制示例
通过定制 CodeWarrior,你可以增强你的工作环境和提高工作效率。 除了对菜单和工具条的
简单修改之外,你可能还想只需点击一个图标或键入一个组合键就可以执行一个脚本或启动一个
应用程序。有时当你正在参与一个非常庞大的开发项目的时候,需要做一些定制工作来解决自动
设置带来的混乱问题。例如,你可以创建一个脚本来完成以下这些工作:
自动删除编译过程中产生的多余的文件;
将输出文件复制到一个本地或网络上的目录中以做备份;
为你的工程创建一个安装应用程序。
对于 Windows 用户而言,可以通过 VBScript,Perl或其它使用通用对象模型(Common Object
Model,COM)接口的脚本语言来驱动 CodeWarrior Pro 5 IDE 完成一系列复杂的操作。如果使用
VBscript,你还需要一个可以执行 VBScript 的的应用程序(如 Internet Explorer 5),或者是一个
Scripting Host 工具——可以从以下网址下载 http://msdn.microsoft.com/scripting/windowshost/。
下面的 VBScript 脚本用于指导 CodeWarrior IDE 删除当前工程中的所有目标(object)文件,以
便执行一个“干净的构建(build)”,然后再执行构建工作(编译和连接操作)。该脚本还打开一个编
辑器窗口来显示操作结果(成功或失败的)的总结。这个脚本是有点长,但设计得很好,因为其中包
含了许多用于错误检查的代码。
' 文件名:Build.vbs
' 作者: Jim Trudeau, Metrowerks
' 以及版权声明信息
option explicit
'所有的变量都必须进行声明
dim CW
上海天马
第六章 定 制
RemoveObjectCode true
'*** 获得构建代码后的消息
set buildMessages = target.BuildAndWaitToComplete
ProcessMessages (buildMessages)
end if
'========================================================= '
ProcessMessages - get errors and warnings, process them ' receives build
messages
'=========================================================
sub ProcessMessages (messages)
dim result '返回值
dim messageList '消息收集
'*** 获得错误的数量
result = messages.ErrorCount
if result = 0 then textEngine.InsertText(eol &"Build Succeeded." &eol)
else textEngine.InsertText(eol &"!!!BUILD FAILED!!!" &eol)
'*** 显示错误的数量
textEngine.InsertText("Number of errors: " &result &eol)
'*** 获得错误清单
set messageList = messages.Errors
'*** 处理错误
ProcessMessageList (messageList)
end if
'*** 检测是否有警告信息
result = messages.WarningCount
上海天马
第六章 定 制
'*** 显示数量
textEngine.InsertText("Number of warnings: " &result &eol)
'*** 取得警告信息并处理之
if result then
'*** 获得警告信息清单
set messageList = messages.Warnings
'*** 处理警告信息
ProcessMessageList (messageList)
end if
end sub
'========================================================= '
ProcessMessagelist - loop through messages, report info ' receives message
collection, could be errors or warnings
'=========================================================
sub ProcessMessageList (messageList)
dim result '返回值
dim index '循环计数器
dim message '个人信息
'*** 遍历消息清单
for index = 0 to messageList.Count-1
'*** 获得个人信息
set message = messageList.Item(index)
'*** 获得消息文本
result = message.MessageText
'*** 显示消息文本
PDA开发Page 5 of 10
上海天马
第六章 定 制
textEngine.InsertText(result &eol)
****在错误中忽略一行(skip a line between errors )
textEngine.InsertText(eol)
next
end sub
因为使用了微软公司的 OLE/COM 查看器工具,这个 IDE 支持许多 COM 对象。一个脚本语
言可以使用这些对象来与 CodeWarrior IDE 进行通信。关于 CodeWarrior 定制与脚本机制,
还有很多优秀的功能,但在这里就不详述了,因为 CodeWarrior 把这些功能实现得非常好。
打开上面所描述到得窗口自己看看吧!当你熟练使用了 CodeWarrior 的一些功能之后,你会
发现它是非常的易用!
上海天马
第七章 库 和 Microsoft Foundation Classes (MFC)
库
库是什么?这是一个你必须知道如何回答的问题!一个库就是一个包含了你程序运行时需要调用的
函数的文件。在库中提供的典型函数有:文件和屏幕的 I/O 函数,内存管理服务,3-D 图形显示以及
科学计算函数。使用库可以缩短你的开发时间并简化你的应用程序。在开发程序当中,你会经常地使
用到库。以下是几种在编程中使用库的方法:
将你需要用到的函数写在一个源文件中,然后把它编译成为一个库或 DLL;
使用别人提供的库;
使用一个其他人提供的共享库(或 DLL)。
编写你自己的库或 DLL
第一种使用库的方法很简单。你只需在一个 C 或 C++ 源文件中写入源代码,然后编译、连接并执
行它。这是我们在本课程中早已学到的知识。就这样你就可以创建你自己的一个库,就这么简单!
使用别人的库
使用别人提供的库稍稍有些不同。由第三方开发商提供的库通常包括以下几个文件:库文件(通常
是以 .lib 为后缀名的文件),一个头文件(后缀名为 .h) 以及(我们希望有但不一定有)一些文档(后缀名
为.doc)。头文件是用于让编译器将你的程序中使用的函数与库中的函数匹配起来的。你只需将头文件
包括到你的源文件中,然后就可以象调用操作系统的函数一样来调用库函数了。在大多数情况下,通
常将 .h 和 .lib 的文件放置于源文件目录中,就像 CodeWarrior 定义的一样。这个路径通常在你的工
程文件所在的目录,或者其下的子目录中。需要注意的是,CodeWarrior 提供的某些特定的库,例如
它的 MSL,就不是放在你的工程所在的目录中。实际上,CodeWarrior 有一个特定的存取路径,叫
做 system paths, 它指向 CodeWarrior 自带的库和头文件存放的目录。
上海天马
第七章 库 和 Microsoft Foundation Classes (MFC)
使用一个共享库:
第三方厂商将库函数与它们的产品打包起来发行,而不是以源文件的方式发行这些库。如果你是一
个开发商,使用这样的方式来发行你的库会更安全一些,特别是你希望由此来保护你的知识产权时。
但是这种方法也存在一个问题,就是如果在库中存在一个 bug 的话,用户是没办法对之进行修改
的,只能从开发商那里取得一个修正后的版本。但是这做起来也有许多困难。
共享的 DLL:
DLL 和库文件非常相似,两者之间唯独的不同就是库文件通常都会被编译并连接到你的应用程序
中,而 DLL 则是存放在你的系统目录下或者是在编译后的应用程序的目录下的一个独立的文件。当
应用程序运行时,它会自己去找到该 DLL 并使用它的服务。DLL 文件的后缀名为 .dll。
使用共享的DLLs 的好处:
DLL 的优点就是它能够被共享。那么,共享的好处在哪里呢?首先,可以让多个应用程序使用一个
DLL。当几个程序都使用一个占用很大磁盘和内存空间的 DLL 时,就很有用了。另外,如果一个
DLL 包含了一个 bug,然后被修正了,那么所有使用这个 DLL 的程序都会被自动更新,这样就可以
大大地节约你的开发时间。那么哪种库应该由多个应用程序共享呢?比如操作系统中的每一个视窗就
是使用共享的 DLL 得来的。
使用共享 DLL 需要注意的地方:
CodeWarrior IDE 的 CD-ROM 中有许多库,在因特网上还有成千上万的库。记住,当你使用第三
方厂商的库时,千万要先查查毒。这就如同出门前要关门一样的有必要。
CodeWarrior 自带的库分为两类。一个是 MSL,它提供 ANSI C/C++ 的标准函数。MSL 已经被移
植到许多平台上了,因此可以在 Windows,Mac OS 和 Solaris 系统中使用它的函数。另一个是供特
定平台使用的库。例如,在 Windows 版的光盘中,你可以发现提供了使用 Windows APIs 和 MFC
库的Windows 32 支持库,它提供了编写面向对象的 Windows 应用程序的框架。随着你的编程经验
的增长,你将发现这些特定库的更多的用途。
MFC是什么:
上海天马
第七章 库 和 Microsoft Foundation Classes (MFC)
应用程序框架还能处理分发消息(例如用户击键的动作、鼠标点击、绘画消息等等)到应用程序中的许多按
钮、列表、窗口和控件上。这个功能帮助你能够集中注意力到实现应用程序的功能而不是界面上,把那些
创建界面的工作留给应用程序框架吧。
应用程序框架提供了许多超过老式风格的 roll-your-own 方法。首先,这些代码是成熟和经过严格测试的。
每天都有成百上千的开发者使用 MFC 来开发应用程序。每当 Windows 操作系统增加了一些新的功能的时
候,MFC 也会不断地被升级,你可以通过使用新版本的 MFC 来编译你的应用程序,以便获得所有新的功
能特色,而且几乎不用对应用程序的源代码做任何修改。
应用程序框架还提供可重用的代码。代码重用是象 C++ 这样的面向对象的编程方法得以发展的主要原因
之一。通过将可重用的代码封装为类,你可以很容易地使用已经存在的类来添加需要的功能。
代码重用使得你可以使用经过严格测试的代码来构造你的应用程序,并很容易获得预期的功能。而且你还
可以很容易地将你编写的类与其它需要同样功能的人进行共享。
与你自己创建所需框架而言,使用应用程序框架有时会使得你的程序稍大一些。因为现代计算机通常都配
置了足够数量的内存,而且这个框架可以作为一个 DLL 来使用,所以增加这么一些程序体积还是很值得的。
PowerPlant 和 MFC 是两个很值得你去熟练使用的高效的工具。
如何安装和使用 MFC 接口工具
MFC 接口工具(包括对话编辑器和图象编辑器)可以在 CodeWarrior 安装光盘上找到。但是,它们并不是作
为 CodeWarrior 安装程序的一部分存在的,因此在完成了 CodeWarrior 的安装后,在硬盘上你还是找不到
MFC。为了安装这些工具,请按照以下步骤进行:
找到 iTOOLS.Exe 文件。这是安装 MFC 接口工具必须的安装程序。iTools.Exe 文件可以在
C:\Program\Files\Metrowerks\CodeWarrior\BinSDK\bin\ 目录下找到。如果在那儿找不到这个文件,那么
就到 CodeWarrior 的安装光盘上去找。该文件应该在 Extras\SKDs\Win32\Microsoft Win32 SDK Tools\目
录下。
注意: 该安装文件 (iTOOLS.Exe) 将会询问你想在哪里保存 MFC 接口工具。但不行的是,它却没有提供定
位目录用的浏览(browser)按钮可用,因此你必须手工的输入一个路径。如果你并不能确定你输入的路径是
否就是你想要保存这些工具的路径,你可以先在那个目录中找到一个文件,然后通过查看该文件的属性(在
该文件上点击右键然后选择Properties 项),从这个属性框上你可以复制到完整的路径,并把它填入到安装
过程中提示要输入安装路径的编辑框中。
图 7-1 MFC 的用户界面构造器
上海天马
第七章 库 和 Microsoft Foundation Classes (MFC)