本节介绍一下Console程序,虽然主要介绍MFC程序,但是在这个过程中会经常用到Console程序做事例介绍,而且本着全面的原则,也方便大家以后使用Console程序做一些小的编程工作,在这里我觉着还是有必要介绍一下Console程序的。
说道Windows程序,一定会有WinMain、消息循环、窗口函数。即使你只是产生一个对话框(DialogBox)或消息窗(MessageBox),也有隐藏在WindowsAPI(DialogBox和MessageBox)内的消息循环和窗口函数。
大家有没有觉得跟以前学习C语言或C++编程完全不一样了,以前程序只需要有main()函数和各种函数就可以了,简简单单的。而现在怎么会那么复杂,有那么多的消息循环等东西。
其实说到Win32程序,并不是每个都如WindowsGUI程序那么复杂可怖。在VisualC++中有一个“DOS-like”程序,可以调用部分的、不牵扯到图形使用者接口(GUI)的Win32 API。这种程序就是console程序。
1、Console程序与DOS程序的差别
其实DOS程序和console程序是不能混为一谈的,下面对这两种非常相似的程序做下比较:
(1)编写方式
在Windows环境下的DOS Box中或是在Windows版本的各种C++编译器套件的集成开发环境(IDE)中,利用Windows编译器和链接器做出来的程序,都是所谓的Win32程序。
过去在DOS环境下开发的程序,称为DOS程序。
两种程序都是以main为程序进入点,都可以调用C runtime函数,不同之处是Console程序还可以调用不牵扯GUI的Win32 API函数,而DOS程序不能。(解释一下:C runtime函数就是指标准的C语言函数)
(2)程序功能
DOS程序可以在Windows的DOS Box中运行,但是无法使用windows的API函数;
Console程序当然能在windows下运行,而且能够调用API函数,所以它可以使用Windows提供的各种高级功能。可以产生进程(processes),产生执行线程(threads)、取得虚拟内存的信息、刺探操作系统的各种数据。但是不能调用与GUI有关的各种API函数,所以不会有华丽的外表。
(3)可运行的文件格式
DOS程序是所谓的MZ格式。Console程序的格式则和所有的Win32程序一样,是所谓的PE(PortableExecutable)格式,意思就是它可以被拿到任何Win32平台上执行。
2、Console程序设计例子
#include <afx.h>
#include <stdio.h>
int main()
{
int lo,hi;
CString str;
CStdioFile fFibo;
fFibo.Open(_T("FIBO.DAT"),CFile::modeWrite | CFile::modeCreate | CFile::typeText);
str.Format(_T("%s"),_T("Fibonacci sequencee, less than 100 :"));
printf("%s",(LPCTSTR)str);
fFibo.WriteString(str);
lo = hi =1;
str.Format(_T("%d\n"),lo);
printf("%s",(LPCTSTR)str);
fFibo.WriteString(str);
while(hi<100)
{
str.Format(_T("%d\n"),hi);
printf("%s",(LPCTSTR)str);
fFibo.WriteString(str);
hi = lo+hi;
lo = hi-lo;
}
fFibo.Close();
return 0;
}
这是一个简单的MFC Console程序,其中只用到了两个与UI无关的MFC类:CStdioFile和CString。
在MFC中,CFile用来处理正常的档案I/O操作。CStdioFile衍生自CFile,一个CStdioFile对象代表以C runtime函数fopen所开启的一个stream档案。Stream档案有缓冲区,可以以文字模式(默认状态)或二进制模式开启。
CString对象代表一个字符串,是一个完全独立的类。