windows的应用程序之CUI(控制台)程序和(GUI)程序

CUI是console uers interface,GUI是graphical user interface,顾名思义,一个是基于控制台的,一个是基于窗口的。所谓的控制台,其实是一种文本,所以,控制台程序也就是基于文本的应用程序。说起应用程序,就不得不说进程,一个应用程序的实例(也就是运行着的应用程序)就是一个进程,所谓进程,其实也是一个空架子,它由一个记录该进程的内核对象和一个存放可执行文件所有代码和数据以及动态内存分配的地址空间。有了这样的信息,操作系统才可以有效地管理进程,有了这样的地址空间,才可以在进程中启动线程。这里说到线程,其实线程才是真正的执行代码的核心,而进程只是提供了一个孕育的环境,进程是有惰性的,当一个进程启动时,必须有第一个线程启动,这个线程叫主线程,如果愿意,再由主线程启动一级,二级以及多级的子线程。同样,当进程中所有线程都退出时,进程也就结束了自己的生命。有了这些我们就可以讨论一下CUI和GUI的区别之处了。

大家都知道,windows应用程序都要有一个入口函数,CUI是main,而GUI是winmain,也正是因为这样的不同入口,区分了CUI和GUI。说到入口,就应该有这样的疑问“入口之前是什么?”其实,在进入入口之前,首先执行的是操作系统的加载程序,而这个加载程序通过检查可执行文件映像的文件头,来链接适当的入口函数,同时,对CUI和GUI进行明显的区分:对于CUI程序加载程序自动确保有一个可用的文本控制台,而对于GUI程序就仅仅是将其加载。这就是说,你希望实现什么类型的应用程序,就给怎样的链接信息(LINKER->SUBSYSYEM里可以指定)。需要特别注意的是,经过连接器的指示,操作系统去调用入口函数了,可你万万没有想到,此时,你的main或者winmain其实依然没有被调用,实际上,此时的连接器指示的是操作系统调用的C/C++运行库中的启动函数,刚才说了应用程序有CUI和GUI之分,同理,在C/C++运行库中,同样有两个版本的启动函数,winmainCRTStartup 和 mainCRTStartup(其实是四个,另外两个是用为unicode,这两个是ansi,道理依然,这里不再赘述),

而这两个函数才是真正的导火线,他们将针对进行一些列的设置:

1.获取进程命令行参数的指针和进程环境变量的指针;

2.初始化C/C++运行库的全局变量;(这也是为什么你只要在自己的代码中包含了stdlib就可以用_osver的原因)

3.初始化内存分配函数(malloc,calloc)

4.调用所有全局的和静态的C++类对象的构造函数。

5.进入用户的入口。(CUI:main,GUI:winMain)

看windows核心编程的总结,对windows应用程序的来龙去脉更加了解了。share to all!

你可能感兴趣的:(windows的应用程序之CUI(控制台)程序和(GUI)程序)