目录
前言
AfxWinMain函数(winmain.cpp):
1.AfxWinMain:
2.AfxGetThread函数(thrdcore.cpp):
3.AfxGetApp是一个全局函数,定义于(afxwin1.inl)中:
afxCurrentWinApp,定义于(afxwin.h*)中,代码如下:
接上:VC++基于MFC的程序框架剖析(三)CWinApp类的定义(afxwin.h*)
接下:VC++基于MFC的程序框架剖析(五)InitInstance函数
前言
当程序调用了CWinApp类的构造函数,并执行了CTestApp类的构造函数,且产生了theApp 对象之后,接下来就进入 WinMain 函数。
根据如下所示代码,可以发现WinMain函数实际上是通过调用AfxWinMain函数来完成它的功能的。
连接:VC++基于MFC的程序框架剖析(二)
extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine, int nCmdShow)
#pragma warning(suppress: 4985)
{
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
连接:VC++基于MFC的程序框架剖析(一)
AfxWinMain函数(winmain.cpp):知识点 :因为c++不是完全面向对象的函数,为了让各个类有机地结合在一起,就要定义一些全局函数。
全局函数(在每个类中都可以使用),应用程序框架函数。
Afx前缀的函数代表应用程序框架(Application Framework)函数。
应用程序框架实际上是一套辅助我们生成应用程序的框架模型。
该模型把多个类进行了一个有机的集成,可以根据该模型提供的方案来设计我们自己的应用程序。
在 MFC 中,以Afx为前缀的函数都是全局函数,可以在程序的任何地方调用它们。
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\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;
}
1.AfxWinMain:
首先调用AfxGetThread函数获得一个CWinThread类型的指针。
接着调用AfxGetApp函数获得一个CWinApp类型的指针。
MFC类库组织结构图中可以知道CWinApp派生于CWinThread。
CWinThread* pThread = AfxGetThread();
CWinApp* pApp = AfxGetApp();
2.AfxGetThread函数(thrdcore.cpp):
位置:C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\atlmfc\src\mfc
CWinThread* AFXAPI AfxGetThread()
{
// check for current thread in module thread state
AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
CWinThread* pThread = pState->m_pCurrentWinThread;
return pThread;
}
if (pApp != NULL && !pApp->InitApplication())
AfxGetThread函数返回的就是在CWinApp构造函数中保存的this指针(如下代码)。
对Test程序来说,这个this指针实际上指向的是CTestApp的全局对象:theApp。
连接:CWinApp的构造函数中有这样两行代码:
pThreadState->m_pCurrentWinThread = this;
pModuleState->m_pCurrentWinApp = this;
3.AfxGetApp是一个全局函数,定义于(afxwin1.inl)中:
位置:C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\atlmfc\include
_AFXWIN_INLINE CWinApp* AFXAPI AfxGetApp()
{ return afxCurrentWinApp; }
afxCurrentWinApp,定义于(afxwin.h*)中,代码如下:
#define afxCurrentWinApp AfxGetModuleState()->m_pCurrentWinApp
AfxGetApp函数返回的是在CWinApp构造函数中保存的this指针。
对Test程序来说,这个this指针实际上指向的是CTestApp的对象:theApp。
也就是说,对Test程序来说,pThread和pApp所指向的都是CTestApp类的对象,即theApp全局对象。
接上:VC++基于MFC的程序框架剖析(三)CWinApp类的定义(afxwin.h*) 接下:VC++基于MFC的程序框架剖析(五)InitInstance函数
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)