按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
制造方式
在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 的兼容性稍差)。
29
…………………………………………………………Page 92……………………………………………………………
Console 程序当然更没有问题。由于console 程序可以调用部份的Win32 API (尤其是
KERNEL32。DLL 模块所提供的那一部份),所以它可以使用Windows 提供的各种高级
processes threads
功能。它可以产生进程( ),产生执行线程( )、取得虚拟内存的信息、
刺探操作系统的各种资料。但是它不能够有华丽的外表…因为它不能够调用与GUI 有
关的各种API 函数。
DOS console pr intf cout scanf
程序和 程序两者都可以做 输出和 输出,也都可以做 输
入和cin 输入。
可执行档格式
DOS 程序是所谓的MZ 格式(MZ 是Mark Zbikowski 的缩写,他是DOS 系统的一位
Console Win32 PE Portable
主要构造者)。 程序的格式则和所有的 程序一样,是所谓的 (
Executable Win32
)格式,意思是它可以被拿到任何 平台上执行。
Visual C++ 附有一个DUMPBIN 工具软件,可以观察PE 文件格式。拿它来观察本节
的JBACKUP 程序和MFCCON 程序(以及第3章的所有程序),得到这样的结果:
H:u004progjbackup 。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 程序,则得到这样的结果:
30
…………………………………………………………Page 93……………………………………………………………
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
Console 程序的编译联结
你可以写一个makefile,编译时指定常数/D_CONSOLE ,联结时指定subsystem 为
console ,如:
#0001 # filename : pedump。mak
#0002 # make file for pedump。exe
#0003 # usage : nmake pedump。msc (Visual C++ 5。0)
#0004
#0005 all : pedump。exe
#0006
#0007 pedump。exe: pedump。obj exedump。obj objdump。obj mon。obj
#0008 link /subsystem:console /incremental:yes
#0009 /machine:i386 /out:pedump。exe
#0010 pedump。obj mon。obj exedump。obj objdump。obj
#0011 kernel32。lib user32。lib
#0012
#0013 pedump。obj : pedump。c
#0014 cl /W3 /GX /Zi /YX /Od /DWIN32 /D_CONSOLE /FR /c pedump。c
#0015
#0016 mon。obj : mon。c
#0017 cl /W3 /GX /Zi /YX /Od /DWIN32 /D_CONSOLE /FR /c mon。c
#0018
#0019 exedump。obj : exedump。c
#0020 cl /W3 /GX /Zi /YX /Od /DWIN32 /D_CONSOLE /FR /c exedump。c
#0021
#0022 objdump。obj : objdump。c
#0023 cl /W3 /GX /Zi /YX /Od /DWIN32 /D_CONSOLE /FR /c objdump。c
如果是很简单的情況,例如本节的 JBACKUP 只有一个 C 原代码,那么这样也行 (在
命令列之下):
cl jbackup。c A 将获得 jbackup。exe
31
…………………………………………………………Page 94……………………………………………………………
注意,环境变量要先设定好(请参考本章稍早的「如何产生Generic。exe 」一节)。
第3章的Frame_ 程序则是这样完成的:
cl my。cpp mfc。cpp my。exe
将获得
至于到底该联结哪些链接库,全让CL。EXE 去伤脑筋就好了。
JBACKUP :Win32 Console 程序设计
撰写console 程序,有几个重点请注意:
1。 进入点为main 。
pr intf scanf cin cout
2。 可以使用 、 、 、 等标准输出入装置。
3。 可以调用和GUI 无关的Win32 API 。
我的这个JBACKUP 程序可以有一个或两个参数,用法如下:
C:SomeoneDir》JBACKUP SrcDir 'DstDir'
例如JBACKUP g: k:
将磁盘目录SrcDir 中的新文件拷贝到磁盘目录DstDir ,
并将DstDir 的赘余文件杀掉。
DstDir k: …MO …
如果没有指定 ,预设为 (那是我的可写入光驱 的代码啦)
并将k: 的磁盘目录设定与SrcDir 相同。
例如JBACKUP g:
而目前g: 是g:u002doc
g:u002doc k:u002doc k:u002doc
那么相当于把 备份到 中,并杀掉 的赘余文件。
JBACK 检查SrcDir 中所有的文件和DstDir 中所有的文件,把比较新的文件从SrcDir
中拷贝到DstDir 去,并把Ds