| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2870 人关注过本帖
标题:寻找MFC中”失落”的WINMAIN()函数[分享]
只看楼主 加入收藏
cpp向往
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-3-1
收藏
 问题点数:0 回复次数:5 
寻找MFC中”失落”的WINMAIN()函数[分享]

转自: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 函数 分享 
2006-03-01 20:54
zinking
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:35
帖 子:916
专家分:0
注 册:2004-12-5
收藏
得分:0 

hehe入门必读阿,知道了这个才知道mfc怎么工作啊!


http://kongfuziandlife. http://codeanddesign.
2006-03-01 21:39
GISboy
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-2-28
收藏
得分:0 
很好啊,我听别人说过,但是听的不是很懂,也没有深入看这个执行的具体过程!您能有这样的求知过程,真是佩服!

2006-03-05 13:28
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
其实你不必关心Winmain,它在MFC中没有太多作用,另外开始你的程序时不必按“F5”,“F8”之类的,按F10,第一行程序就停在_tWinMain ,也就势WinMain上。另外只有你写的程序是可执行的主程序的时候才需要有这个WinMain()。

http://myajax95./
2006-03-05 17:27
幽园香客
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:231
专家分:142
注 册:2006-2-27
收藏
得分:0 
不错!

做个有用的人!
2006-03-09 16:58
cpp向往
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-3-1
收藏
得分:0 
引用:“
其实你不必关心Winmain,它在MFC中没有太多作用,另外开始你的程序时不必按“F5”,“F8”之类的,按F10,第一行程序就停在_tWinMain ,也就势WinMain上。另外只有你写的程序是可执行的主程序的时候才需要有这个WinMain()。”

在Windows下编程,如果用MFC,可以不用关心WinMain(),然而本篇的用意是对MFC一探究竟,懂其原理,做到心中有数,VC提供给我们的,真正强大高效的还是SDK,而不是MFC。
再深入下去,正如c语言的汇编代码中,main()并不是真正的入口点,而是end后的标识符。
我想我们学计算机,不是仅仅学别人为我们包装好的东西,更要懂其原理。这才是重要的。
2006-03-24 15:49
快速回复:寻找MFC中”失落”的WINMAIN()函数[分享]
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043538 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved