Windows中有两种程序,一种是图形界面的GUI程序,一种是基于文本的CUI程序,这一种也就是CONSOLE程序(控制台程序),这两种程序的区分其实是很模糊的.
在VC中我们可以选择创建这两种交互方式不同的程序,对应它们的链接开关分别是: \SUBSYSTEM:WINDOWS和\SUBSYSTEM:CONSOLE,当我们执行一个程序时,链接程序会根据这些开关来嵌入相应的子系统,而后加载程序在加载时间会根据这些开关来执行:
1.如果是CONSOLE程序,加载程序会为其生成CONSOLE窗口,就像CMD或COMMAND那种窗口,以便用于输入和输出,而后加载.
2.如果是GUI程序,加载程序就直接加载,而不会管程序拥有什么样的界面.
加载后接下来就是找程序入口点启动程序了,WINDOWS程序的入口点一般有以下几种情况:
1.int WINAPI WinMain(HINSTANCE, HINSTANCE, PSTR, int)//这个是ANSI
2.int WINAPI wWinMain(HINSTANCE,HINSTANCE, PWSTR,int)//这个是UNICODE
以上两个是GUI程序的入口函数,以下的是CUI的入函数:
3.int _cdecl main(int,char *, char*) //这个是ANSI
4.int _cdecl wmain(int,wchar_t *, wchar_t *) //这个是UNICODE版
加载程序并不会直接调用入口,它会调用C/C++运行期启动函数,相对于上面的入口,启动函数也是不同的:
1.WinMainCRTStartup
2.wWinMainCRTStartup
3.MainCRTStartup
4.wMainCRTStartup
启动函数再调用入口程序的入口函数来运行我们的程序.这里有一些问题,大侠们帮帮忙忙讨论讨论,不胜感激,
1.我不知道上面所说的有多少是一定正确的,所以请大家讨论讨论.
2.对于一些定义我现在还不是很明确,像"c\c++运行期"是什么,我还是一知半解,有劳各位大侠们帮忙告知,不胜感激!
3.是链接后才加载,还是加载后链接.
4.建立进程内核对象是加载程序做的,还是启动程序做的或是其它什么什么做的?