zoukankan      html  css  js  c++  java
  • MFC程序运行原理初探

    几年前,写过一段时间的MFC,但是只知其然不知其所以然,最近闲来无事,研究了一下MFC程序的运行顺序,特此记录一下。

    首先,如果我们创建一个MFC程序的话,首先会自动生成一个CWinApp的子类,程序运行时,最先执行的就是该子类的构造函数。

    然后,会由连接器调用函数内自动连接的函数AfxWinMain,这个函数在文件winmain.cpp中实现,这也可以被作为整个MFC程序的入口函数,其代码如下:

    int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        _In_ 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)
            {
                TRACE(traceAppMsg, 0, "Warning: Destroying non-NULL m_pMainWnd
    ");
                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)
        {
            TRACE(traceAppMsg, 0, "Warning: Temp map lock count non-zero (%ld).
    ",
                AfxGetModuleThreadState()->m_nTempMapLock);
        }
        AfxLockTempMaps();
        AfxUnlockTempMaps(-1);
    #endif
    
        AfxWinTerm();
        return nReturnCode;
    }

    函数执行时,先通过AfxGetThread()和AfxGetApp()获取两个指针对象,这两个函数前者是获取当前运行的线程对象,后者是获取当前运行的APP对象,细心的话,可以发现CWinApp是继承自CWinThread类的,所以如果是单线程的应用的话,两者返回的应该是同一个对象指针,而这个对象正是我们前面所提到的CWinApp的子类。

    于是一切都顺理成章了,首先调用InitApplication()函数,然后调用InitInstance()函数,最后调用Run()来接受界面上的消息进行相应的处理。

  • 相关阅读:
    python中的反射
    ZOJ 3827 Information Entropy 水
    我的软考之路(七)——数据结构与算法(5)之查找
    nginx.conf 集群完整配置
    恼人的函数指针(二)
    C语言100个经典的算法
    spring事务心得积累
    Vue报错:OPTIONS 405 Method Not Allowed以及CORS跨域错误
    IDA脚本dump内存的示例
    lightProxy
  • 原文地址:https://www.cnblogs.com/lzp666/p/8207163.html
Copyright © 2011-2022 走看看