Windows,应用程序总是需要一个入口函数,在C/C++中,如果没有特别指出,这个函数一般是main或者WinMainMFC,自然也是这样
 
MFC已经自己写好了WinMain,链接程序会在MFC的库文件中找到此函数,她定义在D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc\appmodul.cpp
 
extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
         LPTSTR lpCmdLine, int nCmdShow)
{
    // call shared/exported WinMain
    return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
 
下面我们来看这个AfxWinMain
它定义在D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc\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();
 
    // 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\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)
    {
        TRACE(traceAppMsg, 0, "Warning: Temp map lock count non-zero (%ld).\n",
            AfxGetModuleThreadState()->m_nTempMapLock);
    }
    AfxLockTempMaps();
    AfxUnlockTempMaps(-1);
#endif
 
    AfxWinTerm();
    return nReturnCode;
}

MFC框架要求在任何一个MFC应用程序中,必须定义一个全局的CWinApp派生类对象,MFC中的许许多多的类,函数都依靠此全局CWinApp对象来传递信息。我们知道全局变量的初始化会在入口函数执行之前执行,所以当执行到AfxWinMain时,此全局CWinApp对象已经构造完成。

要使用MFC,在MFC框架中填充我们自己的代码,我们只能选择在CWinApp类的InitInstance()函数中进行,而这里刚好调用了InitInstance()函数。待InitInstance()执行完成之后,通过pThread->Run函数,开始进入消息循环,从此,一个MFC应用程序活起来了

当消息循环因为某些原因退出时,Run函数也完成了他的使命,于是,MFC应用程序Terminated了。

根据这些分析,我们可以建立一个史上最简MFC应用程序(其实一句CWinApp theApp;才算最简单,不过虽可以编译运行,但没什么用):

#include <afxwin.h>

class CSApp : public CWinApp
{
public:
    virtual BOOL CSApp::InitInstance()
    {
        //填写您的代码
        AfxMessageBox("Hello MFC.");
        return TRUE;
    }
};
 
CSApp theApp;


 直接用命令行编译:
cl /MT $文件名$.cpp /link /subsystem:windows 

Java的书似乎都先讲public static void main(String[] args),C#也会先讲static void Main(string[] args),为什么没有什么MFC的书先讲InitInstance()呢?

 


本文链接地址: MFC学习笔记之10:MFC应用程序的生与死
https://blog.qingfengju.com/index.asp?id=118

上一篇: C++的#pragma预处理指令
下一篇: MultiByteToWideChar和WideCharToMultiByte函数的使用

分类:Win32/C++ 查看次数:6388 发布时间:2009/7/10 23:59:59