MFC 程序的执行过程细节
START:--->
1. 主程序入口在 APPMODUL.CPP 中
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
注:“_t”表示支持 Unicode。
//入口的 4 个参数:(1)当前模块实例的句柄 (2)前一个模块实例的句柄 (3)任何命令行参数
(4) 显示窗口标志
2.Step1 中调用的 AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
定义在 “WINMAIN.CPP”中
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL);
int nReturnCode = -1;
CWinThread* pThread = AfxGetThread();
CWinApp* pApp = AfxGetApp(); //声明 CWinApp 类型指针变量,赋值为 AfxGetApp()
// AfxGetApp()是自描述的,返回与程序相关的应用程序对象
// AFX internal initialization
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
//初始化框架,4 个参数与 WinMain()相同
goto InitFailure; //注解 1(关于 AfxWinInit)
//至此,如果 AfxWinInit 完成了上面的所有工作,应用程序和框架就完全初始化了。
//句柄和文件名都初始化了,MFC 就继续初始化应用程序的其他部分。调用 InitApplication()
// App global initializations (rare)
if (pApp != NULL && !pApp->InitApplication())
goto InitFailure;
// 注 : InitApplication() 只 在 16 位 的 Windows 中 有 用 , Windows 升 级 为 32 位 后 ,
InitApplication()基本上没用了,所有的初始化都在 InitInstance()中完成,如下调用。
// Perform specific initializations
// InitInstance()为程序的特定实例进行初始化
//CWinApp 的默认的 InitInstance()不做任何事情,只是返回 TRUE。但 InitInstance()是虚函数,
所以可以放心的覆盖它。InitInstance()内部代码应该包含这样的任务:为应用程序设置所有
的文档和显示主窗口。
if (!pThread->InitInstance())
{
if (pThread->m_pMainWnd != NULL)
{