VC++MFC程序中的WinMain函数(四) AfxWinMain函数 AfxGetThread函数 AfxGetApp函数 afxCurrentWinApp函数

VC++MFC程序中的WinMain函数(四) AfxWinMain函数 AfxGetThread函数 AfxGetApp函数 afxCurrentWinApp函数,第1张

目录

前言

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的程序框架剖析(一)

知识点 :因为c++不是完全面向对象的函数,为了让各个类有机地结合在一起,就要定义一些全局函数。

全局函数(在每个类中都可以使用),应用程序框架函数。

Afx前缀的函数代表应用程序框架(Application Framework)函数。

应用程序框架实际上是一套辅助我们生成应用程序的框架模型。

该模型把多个类进行了一个有机的集成,可以根据该模型提供的方案来设计我们自己的应用程序。

在 MFC 中,以Afx为前缀的函数都是全局函数,可以在程序的任何地方调用它们。

AfxWinMain函数(winmain.cpp):
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函数

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/673318.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存