MFC程序的生死概述

运行一开始,AfxWinMain就调用AfxWinMain函数来初始化主框架,并将hInstance,nCmdShow以及其他AfxWinMain函数参数复制给应用程序

对象的数据成员,然后它调用InitApplication和InitInstance。在MFC的16位版本中,只有传递给AfxWinMain的hPrevInstance参数是空时才调用InitApplication,这表明当前运行的是应用程序的唯一实例。在Win32环境下,hPrevInstance总是空的,因此主框架不必再去检查。32位应用程序能够像使用InitInstance一样方便的使用InitApplication初始化自身,但是InitApplication是为保证MFC先前版本的兼容性而提供的,因此不必应该在32位windows应用程序中使用。如果AfxWinInti,InitApplication或者InitInstance返回0值,则AfxWinMain终止而不是继续运行,应用程序被关闭。只有在上述函数返回非零的值时,AfxWinMain才执行以下关键的步骤。语句pThread->Run();调用应用程序对象的Run函数,该函数执行消息循环并开始向应用程序窗口发送消息。消息循环重复执行,直到WM_QUIT消息从消息队列中被检索到。这时Run跳出循环并调用ExitInstance,返回AfxWinMain中。在执行了最后的一些清除工作后,AfxWinMain执行一个return语句结束应用程序。

int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine, int nCmdShow)
{
    ASSERT(hPrevInstance == NULL);

    int nReturnCode = -1;
    CWinThread* pThread = AfxGetThread();
    CWinApp* pApp = AfxGetApp();

    // AFX internal initialization
    if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
        goto InitFailure;

    // App global initializations (rare)
    if (pApp != NULL && !pApp->InitApplication())
        goto InitFailure;

    // Perform specific initializations
    if (!pThread->InitInstance())
    {
        if (pThread->m_pMainWnd != NULL)
        {
            TRACE0("Warning: Destroying non-NULL m_pMainWnd/n");
            pThread->m_pMainWnd->DestroyWindow();
        }
        nReturnCode = pThread->ExitInstance();
        goto InitFailure;
    }
    nReturnCode = pThread->Run();

InitFailure:
#ifdef _DEBUG
    // Check for missing AfxLockTempMap calls
    if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
    {
        TRACE1("Warning: Temp map lock count non-zero (%ld)./n",
            AfxGetModuleThreadState()->m_nTempMapLock);
    }
    AfxLockTempMaps();
    AfxUnlockTempMaps(-1);
#endif

    AfxWinTerm();
    return nReturnCode;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值