- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MFC源程序设计-计算机安全
MFC源程序设计
MFC程序设计之来龙去脉
(MFC框架程序WINMAIN 函数分析),到后来就没有再管了,其实那只是冰山一角.具体
MFC是怎么运行的,还是没有交待清楚。
说明:1、本文作者在VS2003中跟踪代码,此代码为VS2003中拷贝,使用MFC7。
2、不同框架的MFC程序由所不同,本文以单文档为例。
3、本文读者需要有一定的SDK 的基础,不需要太多,至少知道它
的基本框架和来龙去脉即可!
4、文章只想起到说明作用,所以代码会有一些删除。
学MFC,竟然还不知道MFC 的MAIN 函数在什么地方?怎么运行的?实在不高明。
看过候捷(JJHOU)老师的 《深入浅出MFC》的,对它一定很熟悉。呵呵,本文是献给没
有看过那本书,但是又很希望学习MFC程序设计的朋友的。 (没有看过那本书的朋友还
不赶快去买?)其实本文,主要是对 《深入浅出MFC》第六章的一个总结和补充罢了!
(本文有该书不同的地方,也有一些笔者自己的见解!)
言归正传。
假如你用AppWizard一步一步NEXT下来,然后在CLASSVIEW 中去找寻WINMAIN 函数,
那么你只有失望。MFC最大的特点是什么?封装!MFC 的确封装的太好了,以至于很多想
学习MFC 的人都望而却步。闲话少说,还是继续我们今天的话题,MAIN 函数!实话告诉
你吧,即使你搜索所有的MFC生成的文件,都无法发现WINMAIN 的字眼,那么它就近在
什么地方呢?
我相信你已经想到,MAIN 函数应该在主要的应用程序文件中。难道是 “您定义的程序
名.cpp”这个文件?不错就是它。再Crtl+F一下,看有没有我们要找的WINMAIN 函数?
看来你又要失望了,但是你注意有这样一句:
/////////////////////////////////////////////////////////////////////////////
// The one and only CMyApp object
CMyApp theApp; //本人建立的工程名为My。
是不是很特别,再注意一下那句注释 “The one and only CMyApp object”,每个应
用程序有且只用一个CMyApp对象。我想你应该想到了,WinMain函数每个程序也只能有
一个,那么这个全局对象跟WinMain函数肯定有莫大的关系?没错,相信你的直觉。
特别注意:深晓C++细节的人一定知道,全局对象优先于MAIN 函数执行的道理。如果
你不知道也没关系,那么我在这里告诉你: “全局对象优先于MIAN 函数执行,且构建于
栈中,切记,切记!”
现在,我们该深入WinMain运行机制了,确切的说,应该是MFC 的机制!
首先,看看MFC 的库文件把,它能给我们带来许多惊喜。 (vc6的相应的目录是
\Microsoft Visual Studio\VC98\MFC\SRC;VC7相应的目录是\Microsoft Visual
Studio .NET 2003\Vc7\atlmfc\src\mfc)
现在我们就从这个全局下手,开始今天的旅途。
CMyApp theApp;
此时,系统会执行CMyApp 的父类 (CWinApp)构造函数,再执行CMyApp 的构造函数。
(先有老爹,再有儿子!),此时就会调用CWinApp 的构造函数。
CWinApp 的构造函数 (在VC提供的MFC代码中以“文中的一个字或词组”的方式查询
关键字,此时打开APPCORE.CPP,以下使用相同搜索方式,不再复述。)找到以下内
容:
CWinApp::CWinApp(LPCTSTR lpszAppName)
{
if (lpszAppName ! NULL)
m_pszAppName _tcsdup(lpszAppName);
else
m_pszAppName NULL;
// initialize CWinThread state
AFX_MODULE_STATE* pModuleState _AFX_CMDTARGET_GETSTATE();
AFX_MODULE_THREAD_STATE* pThreadState pModuleState-m_thread;
ASSERT(AfxGetThread() NULL);
pTh
原创力文档


文档评论(0)