为什么mfc的入口是InitInstance()而没有WinMain()
2015-12-12 18:54
696 查看
为什么mfc的入口是InitInstance()而没有WinMain()
学过PE文件格式,就明白,程序在进入WinMain之前要做很多事情,比如初始Dos头,分配函数表,初始化全局变量,之后才进入程序入口(WinMain)
MFC对WindowsAPI进行了封装。在用向导编译成的二进时代码,MFC编译器链接器把源文件编译成PE文件格式存储在磁盘上。
程序执行的时候,从PE文件头开始执行,在进入Winmain函数之前,进行一系列的必备的初始化。
MFC对这一系列的过程进行了封装。提供给编程人员的第一个裸露程序入口就是CWinApp的InitInstance(),其实程序的入口依然是WinMain()函数。
大家都知道,每个程序都有拥有一个进程,每个进程至少有一个线程就是主线程。
CWinThread类是MFC用来封装线程的,这个主线程就是在WinMain函数中创建的,包括UI线程和工作者线程。
因此每个MFC程序至少使用一个CWinThread派生类。被MFC程序员熟知的CWinApp应用类就从这里派生。
InitInstance是CWinThread的一个虚函数,InitInstance就是“初始化实例”的意思,可见,它是在实例创建时首先被调用的。
应用程序总要重载这个虚函数,进行系统设置,创建运行环境。例如,主窗口一定要在InitInstance()中创建,因为该函数退出后就进入该线程的消息循环。
MFC执行流程。
_tWinMain(WinMain的别名,用define替换的)-》AfxWinMain->初始化线程,调用InitInstance初始化窗口,调用Run函数进入消息循环。
相关文章推荐
- 盘点过去一年,MIT人工智能实验室的那些创新
- 人工智能终于能像人类一样学习,并通过了图灵测试
- 浅析C++中虚函数的调用及对象的内部布局http://blog.csdn.net/starlee/article/details/2089358
- MFC中的Invalidate、OnDraw、OnPaint函数的作用
- Daily Scrum 12.12
- Could not find gem 'sass-rails (~> 5.0) x64-mingw32' in any of the gem sources listed in your Gemfil
- 清空缓冲区的方法http://blog.csdn.net/thecorr/article/details/1922541
- scanf/fscanf 的%[]和%n使用方法 http://blog.csdn.net/wesweeky/article/details/6439777
- scanf 编辑 http://baike.baidu.com/link?url=ZFdRhILOqU1Yhds34bLuhgtnQ8TAeRvh6l0asTq9uklyexmtnHPyrOuD5cV
- wait() 与 sleep
- Agent admitted failure to sign using the key
- Donald Trump vs. the Modern Political Campaign
- sublime There are no packages available for installation错误
- 设置 DB2 和 AIX 与条带技术匹配以提高 I/O 性能
- Updating classpath container 提示更新屏蔽
- Daily Scrum 12.11
- 【Beta】Daily Scrum Meeting第六次
- Warning: (vsim-3534) [FOFIR] - Failed to open file "sp_rom_8x256_sr.mif" for reading.
- Daily Scrum NO.4
- NSBundle的使用,注意mainBundle和Custom Bundle的区别