今天QQ上的一朋友问我Windows系统都支持哪些应用程序啊!他编了一天的linux内核,正处于郁闷,焦躁期,而他的好友让他用VC编个小程序,而他以前没有真正在windows下编过代码,所以我还是回答的简洁明了点好~~免得多生事端。

其实以前也有人问过这个问题,其实如果让我来分,windows支持两种类型的应用程序。一种是基于图形用户界面(GUI)的应用程序,另一种是基于控制台用户界面(CUI)的应用程序。基于GUI的应用程序都有一个图形前端。基于CUI的应用程序属于文本操作的应用程序,不需要图形界面。虽然CUI程序包含在屏幕上的窗口中,但窗口只包含文本。命令外壳程序CMD.EXE和COMMAND.COM都是典型的基于CUI的应用程序。

这两种应用程序的界限其实是非常不明朗的。我们可以创建显示对话框的CUI程序,也可以创建生成文本控制台窗口的程序。

我们都知道windows有4个进入点函数,分别是:

 
  
  1. int WINAPI WinMain(  
  2.     HINSTANCE hinstExe,  
  3.     HINSTANCE,  
  4.     PSTR pszCmdLine,  
  5.     int nCmdShow);  
  6.  
  7. int WINAPI wWinMain(  
  8.     HINSTANCE hinstExe,  
  9.     HINSTANCE,  
  10.     PWSTR pszCmdLine,  
  11.     int nCmdShow);  
  12.  
  13. int __cdecl main(  
  14.     int argc,  
  15.     char *argv[],  
  16.     char *envp[]);  
  17.  
  18. int __cdecl wmain(  
  19.     int argc,  
  20.     wchar_t *argv[],  
  21.     wchar_t *envp[]); 

聪明的人马上会发现,上面4个函数其实是两类,一类是带w的,一类是不带w的,其实带w的只是支持UNICODE编码方式的。什么?你不知道什么是UNICODE,You Out了!那还不赶紧看看我的另一篇blog,里面有详细的介绍哦~~http://rangercyh.blog.51cto.com/1444712/497922

写过windows下的应用程序的童鞋都知道winmain是GUI的入口函数,main是CUI的入口函数。其实操作系统是不会调用你编写的入口函数的,它调的是C/C++的启动函数。下面是对应的调用关系:

你写的入口函数       操作系统调用的C/C++函数

WinMain             WinMainCRTStartup

wWinMain            wWinMainCRTStartup

main                mainCRTStartup

wmain               wmainCRTStartup

当热这不是我要讲的重点,有兴趣的朋友还是可以研究下的。

我的朋友还有个非常让人难以忍受的问题,就是他使用VC++写程序时,新建的工程是Win32应用程序,而不是控制台程序,结果他写的入口函数却是main函数。这确实是一个让人纠结的问题。当他运行时编译器便报错,说找不到入口函数,哎~~谁叫我是他朋友呢!这个时候有4个选择:

  1. 将main函数改为WinMain。然后把整个控制台程序改为一个Win32程序的框架。
  2. 重新创建一个Win32控制台程序,将现有的代码都拷贝进去。(大多数人是这么干的,其实这不是最好的方法,当你的项目大的时候就会很麻烦)
  3. 点击Project Setting对话的Link选项卡,将/SUBSYSTEM:WINDOWS开关改为/SUBSYSTEM:CONSOLE。(这是一个非常棒的方法,不过我一般使用最后一种)
  4. 还是进入到上面那个Link选项卡,然后把/SUBSYSTEM:WINDOWS开关下的内容都删掉。(当没有链接程序开关时,链接程序便会自动确定应用程序应该链接到哪一个子系统,通过代码中的入口函数(WinMain,wWinMain,main,wmain )来选择调用哪一个C/C++启动函数)

 

本来我还想谈谈对windows程内核的相关概念的,可我那朋友居然放弃了windows,又回到他那可爱的linux下了。。。