当Windows的Shell(资源管理器)侦测到使用者意欲执行一个Windows程序,就会调用加载器将程序加载,然后调用C startup code,后者再调用WinMain,开始执行程序。WinMain的四个参数由操作系统传递进来。
即:
① 使用者双击exe,想要执行一个Windows程序
② Windows资源管理器侦测到该行为,于是调用加载器,将程序加载进来
③ Windows资源管理器调用C startup code
④ C startup code调用WinMain,开始执行程序
在MFC中,使用一个全局函数AfxWinMain来代替原来的WinMain。
整个调用过程如下:
全局对象theApp通过构造函数初始化
//在程序执行时,就会创建全局对象theApp。theApp创建操作是先于该AfxWinMain函数进行的。theApp的创建会使用构造函数中的默认参数
int AFXAPIAfxWinMain(……)
{
CWinApp* pApp = AfxGetApp();//获取全局对象theApp
AfxWinInit(……); //初始化操作。对theApp的各个成员变量进行设置,并在函数的末尾调用AfxInitThread,将消息队列加大到96
pApp->InitApplication();//内部管理操作,不会改写
pApp->InitInstance();//窗口创建以及其他初始化操作函数。这是CWinApp的虚函数,本身为空,必须改写它。MFC会生成一个默认的改写函数。 //该函数第一步会new一个CMyFrameWnd对象,执行CMyFrameWnd的默认构造函数,而CMyFrameWnd构造函数中有一个Create函数,于是Create函数被调用来创建窗口。但调用Create函数时,Create函数内部会调用CreateEx,而CreateEx会先调用AfxRegisterClass注册窗口,注册完成后调用PreCreateWindow(cs),然后再调用CreateWindowEx来创建窗口。
//当窗口被创建后,该函数开始执行后续步骤,就是用户自定义的一些操作。
nReturnCode = pApp->Run();//程序运行函数,用于激活消息循环。该函数内部有一个While循环。程序的整个运行期间都是处于该While循环的。该While循环即消息循环,不停地进行GetMessage与TranslateMessage、DispatchMessage操作,将消息推往AfxWndProc
AfxWinTerm();//程序结束。执行某些结束操作
}
其中涉及到的最重要的函数就是pApp->InitInstance();
针对单文档、多文档以及对话框,pApp->InitInstance();的内容也不同。
在MFC中,AfxWinMain函数被封装在appModul.cpp文件中,而不是在默认生成的工程文件中。所以从默认生成的文件中是找不到该函数的。