转自:www.vczx.com/forum/
作者:pach
首先申明,我只是一个刚接触VC6.0没多久的新手,但是一向对kernel这个词比较感兴趣。毫无困难的做出一个简单的对话框/单文档/多文档工程。C语言告诉我们,任何一个程序总是有一个main()函数的,Petzold的《Windows Programming》又告诉我们"正如在C程序中的进入点是函数main一样,Windows程序的进入点是WinMain()",可是你新建一个MFC AppWizard(exe)试试,不管是对话框,单文档,多文档工程,在该Project的文件夹中找遍所有文件,就是没有一个WinMain字样(当然,如
果你建的工程名为:WinMain我就没办法说了;-))!
经典C教材不会错,Petzold应该也不会忽悠我们,可是WinMain()呢??
来,我们做个小实验,找找看到底WinMain跑哪去了,如果你是VC新手,也不要紧,这里没有很深的WINDOWS系统编程知识,只是实验:-),如果你是老鸟,则大可不必浪费时间看此拙文。
转入正题:
(1)随便新建一个MFC AppWizard(exe)工程,这里以对话框为例,假设工程名叫"hello",新建过程中除了step1选(basic dialog),其余全选默认。
(2)接下来,在WorkSpace中打开"FileView",
依次点击hello files->Source Files->helloDlg.cpp,
在helloDlg.cpp中找到class CAboutDlg : public CDialog一行,鼠标单击该行,让光标停在该行,按下F9键,设下一个断点.。
(3)设置编译选项为WIN32 DEBUG.(下面解释为什么)。
(4)按下F5,编译程序,会有"One or more breakpoints cannot be set and have been disabled.……"的提示,不用理它,确定,继续运行,来到调试环境。
(5)这时按下Alt+8打开DISASSEMBLY窗口。
怎么样?看到WinMain字样了吧?
可是,慢,细心的您可能已经发现,是_tWinMain,而不WinMain,怎么了?我们又错了?
别急。
(6)打开你的VC安装目录(一般是X:\Program Files\Microsoft Visual Studio\(X:代表盘符)),搜索,在包含文字下填_twinmain,会找到,TCHAR.H头文件,打开TCHAR.H,会找到这么一行:#define _tWinMain WinMain。
原来这里_tWinMain就是WinMain,萎软的WinMain有ANSI和Unicode版本之分!_tWinMain是WinMain的ANSII版本。
(7)另外按下ALT+4看看进程上下文正是我们寻找已久的WinMain
(8)好,现在我们再回到调试窗口(您的调试窗口还没关吧:-)),打开反汇编页,按向上箭头,往上走不远几行,会看到一行绿色appmodul.cpp字样,原来萎软在我们编译时插入了这个文件。搜一下,原来appmodul.cpp是在Visual Studio\vc98\mfc\src文件夹中,Got it!收工!
几点说明:
1.本文环境是Win2000+Visual C++6.0,有人问了,萎软已经出.NET版本的C++了,可是为什么还用这么老的版本呢? 我的机器是比较老式,又没银子升级,装了.NET框架会很慢,另外,现在公司中用Visual C++6.0做开发的还是很多,学它并不是想象的那么过时。萎软似乎总是要要我们不停升级,软件升级,硬件升级,而且越来越倾向于隐藏它的内部结构。
2.上述过程(3)中编译选项要选Win32 Debug,是因为,Win32 Debug是工程的调试版本(好象是一句废话),Win32 Release是发行版,编译过程做了优化,其反汇编信息是没有以上的函数及其反汇编代码的说明的。
3.为什么副标题是----“我们要的是"渔"!”?
经常在网上逛,看一些Visual C++的资料,搜到了台湾某位侯先生的大作,第六章中从“简化的MFC 程序架构-以Hello MFC 为例”开始,给我们来了几个手工写的MFC的程序,然后讲了一通,实例化theApp,接着调用WinMain,并且还大方的告诉我们WinMain()包含在WINMAIN.CPP中,且美其名曰:知其然而不知其所以然,真不是个好办法!(好象是这么文绉绉的两句,记不清了,也懒得再去查)!
可是我看了例子更觉得云里雾里:这些例子你是怎么想出来的?从外文网站?微软的耳语?还是用了什么工具?光说这些,读者而不知道从何而来,让人觉得这位侯先生应归入"天才"一类,而且文中各种来函来电书评一大堆,全是赞美,更让人心生敬畏!
另外请注意这位侯先生的思想取向:“理想如果不向实际做点妥协,理想就会归于尘土。
中华民国还得十次革命才得建立”,本文不想讨论其是否台独人士,我强烈鄙视台独分子,所以,看到书中这句话,记录于此。
刚接触VC不久,不足之处,在所难免,欢迎您指出,不胜感激!
寻找MFC中”失落”的WINMAIN()函数[分享]