不少人把DOS 程序和console 程序混为一谈,这是不对的。以下是各方面的比较。
编写方式
在Windows 环境下的DOS Box 中,或是在Windows 版本的各种C++ 编译器套件的
整合环境(IDE)中(第4章「Console 程序项目管理」),利用Windows 编译器、联结器做出来的程序,都是所谓Win32 程序。如果程序是以main 为进入点,调用C runtime 函数和「不牵扯GUI」的Win32 API 函数,那么就是一个console 程序,console 窗口将成为其标准输入和输出装置(cin 和cout)。
过去在DOS 环境下开发的程序,称为DOS 程序,它也是以main 为程序进入点,可以调用C runtime 函数。但,当然,不可能调用Win32 API 函数。
程序功能
过去的DOS 程序仍然可以在Windows 的DOS Box 中跑(Win95 的兼容性极高,
WinNT 的兼容性稍差)。
C onsole 程序当然更没有问题。由于console 程序可以调用部份的Win32 API(尤其是KERNEL32.DLL 模块所提供的那一部份),所以它可以使用Windows 提供的各种高级功能。它可以产生进程(processes),产生执行线程(threads)、取得虚拟内存的信息、刺探操作系统的各种资料。但是它不能够有华丽的外表-- 因为它不能够调用与GUI 有
关的各种API 函数。
DOS 程序和console 程序两者都可以做printf 输出和cout 输出,也都可以做scanf 输入和cin 输入。
可执行文件格式
DOS 程序是所谓的MZ 格式(MZ 是Mark Zbikowski 的缩写,他是DOS 系统的一位
主要构造者)。Console 程序的格式则和所有的Win32 程序一样,是所谓的PE(Portable Executable)格式,意思是它可以被拿到任何Win32 平台上执行。
Visual C++ 附有一个DUMPBIN 工具软件,可以观察PE 文件格式。拿它来观察本节的JBACKUP 程序和MFCCON 程序(以及第3章的所有程序),得到这样的结果:
H:\u004\prog\jbackup.01>dumpbin /summary jbackup.exe
Microsoft (R) COFF Binary File Dumper Version 5.00.7022
Copyright (C) Microsoft Corp 1992-1997. All rights reserved.
Dump of file jbackup.exe
File Type: EXECUTABLE IMAGE
Summary
5000 .data
1000 .idata
1000 .rdata
5000 .text
拿它来观察DOS 程序,则得到这样的结果:
C:\UTILITY>dumpbin /summary dsize.exe
Microsoft (R) COFF Binary File Dumper Version 5.00.7022
Copyright (C) Microsoft Corp 1992-1997. All rights reserved.
Dump of file dsize.exe
DUMPBIN : warning LNK4094: "dsize.exe" is an MS-DOS executable;
use EXEHDR to dump it
Summary
摘选自《深入浅出MFC-第二版》 侯俊杰