我想知道框架内部的initInstance()是何时调用的。我认为框架内部的WINMAIN类似:int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 LPSTR lpCmdLine, int nCmdShow)
{
if(!pGlobalGAFWinApp)
{
MessageBox("错误警告:找不到框架程序类实例,游戏程序初始化失败!\n""请检查程序是否设定了CGAFApp类的实例对象。",
“错误”, MB_OK|MB_ICONSTOP);
return -1;
} pGlobalGAFWinApp->m_hInstance = hInstance;//pGlobalGAFWinApp类似内部指向实例的指针 if(pGlobalGAFWinApp->InitInstance())//我们自己重载的初始化函数
{
pGlobalGAFWinApp->Run();
return pGlobalGAFWinApp->ExitInstance();
}
else return -1;
}
我想问一下,框架内部本身有InitInstance函数。这函数实现的是注册窗口类和建立窗口的任务。但是如果我们重载的InitInstance如下:BOOL CMyApp::InitInstance()
  { m_pMainWnd=new cMyFrame();
    m_pMainWnd->showWindow(m_nCmdShow);
    m_pMainWnd->UpdateWindow();
   return TRUE;
}他并没有注册窗口类和创建窗口的功能。
难道他会同时调用内部的InitInstance吗?但根据C++语法这里不可能的。请高手解我迷惑~~~~~~

解决方案 »

  1.   

    我是贴主:  我是根据一个游戏的内部框架联想到的MFC框架,或许,我们自己的应用程序一般是在
    cMyFrame类中创建窗口的呢?????唉,我头都大了,高手快进来啊~~~~~
      

  2.   

    我不是用mfc写程序的,我想你的迷惑是不是可以通过调试程序来实现呢?(一步一步跟下去看看呗),希望能有所帮助
      

  3.   

    注册是在 PreCreateWindow 中完成的,
    BOOL CMyApp::InitInstance()
      { m_pMainWnd=new cMyFrame();
        m_pMainWnd.Create(……);//此处要创建窗口
        m_pMainWnd->showWindow(m_nCmdShow);
        m_pMainWnd->UpdateWindow();
       return TRUE;
    }你可以按F11启动程序,然后一步一步的跟踪,就可以看清楚调用的流程了
      

  4.   

    MFC离地InitInstance和你的不一样,MFC的应用程序没有WinMain的是由编译器添加到程序里边,细节参考《MFC深入浅出》如果没有,我帮你查过后贴上来。
      

  5.   

    在MFC\SRC\下有MFC的源代码,搜索一下InitInstance就知道了
    下面是WINMAIN.cpp中的片断/////////////////////////////////////////////////////////////////////////////
    // Standard WinMain implementation
    //  Can be replaced as long as 'AfxWinInit' is called firstint 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;
    }
      

  6.   

    MFC不过是个封装而已。它的注册创建窗口和WIN32的没什么区别。
    AfxWinMain在winmain.cpp里
    AfxRegisterWndClass
    AfxRegisterClass
    在afxwin.h里
    MFC同样是用这些东西注册和创建窗口的。
    (我的是VC7)
      

  7.   

    我是帖主:原来MFC\SRC\下有MFC的源代码,我开始以为没公开呢?谢谢,我可以看源码就知道内部是怎么实现的了,谢谢
      

  8.   

    WinMain是编译器自动加上去的。