Windows下Console和Win32程序差异

来源:互联网 发布:水泥掺量20 算法 编辑:程序博客网 时间:2024/05/01 23:19
  Windows下Console和Win32程序差异


标签:console win32 控制台 程序 
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://vanshell.blog.51cto.com/890307/422909
 
      在Windows操作系统平台下,我们经常会碰到2中方式的程序设计:console和win32。
相信有思想的朋友都会有这样一个疑问,为什么console程序会弹出一个黑框框。当然,以前我一直认为它是控制台程序,他当然有一个黑框框,这是一个逃避问题的想法,不想去追本溯源,找到问题的最根源。我觉得这样不行,突然有天我决定要搞清楚他们之间的关系,在windows操作系统中,console程序设计和win32有什么不同!终于,我有了自己的想法。
       Windows下exe文件他们都是基于PE格式的一种文件。我相信有朋友肯定对于PE文件很了解,它里面有一个Subsystem字段,在程序编译,链接之后这个字段将会被填入一个值。它有大概9个值,但是在windows平台下我们通常只使用2个:CUI和GUI,当然他们会用一个整数值来表示他们,其他的值一般是为了兼容其他操作系统中应用程序而设置的,据说现在的兼容性还是很好,一般情况下是不使用的!好…这点我们清楚了,对于windows操作系统本身来说它肯定也是很清楚这一点的。
       操作系统在为我们的程序创建一个进程后,它就开始分析我们制定程序的PE文件,这个时候它就会读取我们这个PE文件中的那个SubSystem这个字段。如果字段指明SubSystem是CUI(基于控制台),也就是Console程序,操作系统会做为我们的程序进程启动一个控制台。这点我们要很清楚,这个控制台是操作系统为我们创建的!如果字段为GUI,好像常量是5,则指明这是一个GUI(基于图形界面)的程序。则操作系统为程序进程做一些初始化的事情,但是不会创建Console控制台。
       终于,我们有了我们的控制台了…对了,在使用VC的时候,在roject->setting->linking下在/Subsystem就是关于这个字段的开关,使用控制台就是Console,使用win32就是Windows。
      

                            
 
       那控制台程序和win32程序有什么不同呢?
       我个人认为他们真是没有什么不同。控制台程序就是在我们运行我们的程序之前操作系统给提前为程序准备了一个Console的黑窗口而已!然而在Win32程序却没有。但是我们可以自己去创建他们。这里我顺便提一下就是:对于每个程序他有且只能有一个Console。我们可以在GUI里面创建Console但是只能创建一个,如果是在CUI中,我们就不能再创建另外的一个了!!!
       下面用一个简短的程序在Console中创建一个窗口:
       #include <stdio.h>
       #include <windows.h>
 
       int main()
{
       Printf(“hello world!!”);
       MessageBoxEx(Null , “Hellow World!” , “ Hello World!” , IDOK , 1);
      
       Return 1;
}
下面是运行情况:
 

    在Win32中也是可以创建控制台的,由于创建一个窗口要使用相当之多的代码,我个人比较懒,所以下面的代码是使用MFC里面的一个单击按钮消息函数。(呵呵…)和Win32是一样的,应该不会妨碍大家对于我的想法的理解!
void CConsoletest4Dlg::OnButton1()
{
       // TODO: Add your control notification handler code here
       AllocConsole(); //这个函数创建一个控制台
       HANDLE scHOutPut   =   GetStdHandle(STD_OUTPUT_HANDLE);//标准输入
       WriteConsole(scHOutPut, "hello\n ",6,NULL,NULL); //向控制台输入
}
 

      在这里我想提一下就是,在网上有很多网友提出一个这样的问题,使用AllocConsole后,printf等控制台输入函数为什么不能使用!我这里想就我个人理解来说说这个问题。首先,大家想想我们的Win32程序本身是没有控制台的,但是对于Stdin,stdout,stderr这样的全局变量的初始化是在我们程序还没有运行的时候,也就是说那个时候我们的Win32程序根本就没有Console,他们是怎么初始化的,所以这3个标准输入输出的初始化肯定就不正确,后来我们AllocConsole创建了一个Console,我们使用Printf这样的函数,这些函数内部就是使用的这3个标准的输入输出,所以这个标准输入输出就是有问题的,我们就不能将我们的后来的控制台和之前的3个变量关联起来,当然就不能使用了!所以我们只能使用
WriteConsole来完成。
       这只是个人见解,不对的还请各位大神指出!
大家看,win32其实和Console本质上并没有什么不同吧!
在我后面的博客中,我将说说他们更加相同的地方!敬请关注…谢谢!!

本文出自 “HelloWorld” 博客,请务必保留此出处http://vanshell.blog.51cto.com/890307/422909

0 0