MFC教程(9)-- MFC的进程和线程(2)
2010-03-25 20:35:05 来源:WEB开发网参与清理工作的函数有多种、多个,下面结合具体情况简要描述它们的作用。
(1)对动态链接到MFC DLL的应用程序
动态链接到MFC DLL的应用程序退出时,将在DllMain和RawDllMain处理进程分离时清理状态对象,该DllMain和RawDllMain是核心MFC DLL的入口和出口,在DLLINIT.CPP文件中实现,和进程分离时完成如下动作:
DllMain调用AfxTermExtensionModule(coreDll)清理核心MFC DLL的模块状态;调用AfxTermExtensionModule(coreDll, TRUE)清理OLE私有的模块状态;调用AfxTermLocalData(NULL, TRUE)释放本进程或者线程所有的局部变量。
RawDllMain在DllMain之后调用,它调用AfxTlsRealease;AfxTlsRealease减少对_afxThreadData的引用计数,如果引用数为零,则调用对应的CThreadSlotData析构函数清理_afxThreadData所指对象。
(2)对静态链接到MFC DLL的应用程序
如果是静态链接到MFC DLL的应用程序,由于RawDllMain和DllMain不起作用,将由一个静态变量析构时完成状态的清除:
有一个AFX_TERM_APP_STATE类型的静态变量,在程序结束时将被销毁,导致析构函数被调用,析构函数完成以下动作:
调用AfxTermLocalData(NULL, TRUE)释放本进程(主线程)的所用局部数据。
(3)对于动态链接到MFC DLL的规则DLL
对于动态链接到MFC DLL的规则DLL,将在RawDllMain和DllMain中清理状态对象。这两个函数在DllModule.cpp中定义,是规则DLL的入口和出口。当和进程分离时,分别有如下动作:
DllMain清除该模块的模块-线程状态中的所有临时映射,清除临时MFC对象;调用AfxWinTerm;调用AfxTermExtensionModule(controlDLL, TRUE),释放本DLL模块状态m_libraryList中的所有CDynLinkLibrary对象。
RawDllMain设置线程状态的模块状态指针,使它指向线程状态的m_PrevModuleState所指状态。
(4)对于静态链接到MFC DLL的DLL
对于静态链接到MFC DLL的DLL,只有DllMain会被调用,执行以下动作:
清除该模块的模块-线程状态中的所有临时映射,清除临时MFC对象;调用AfxWinTerm;调用AfxTermLocalData(hInstance, TRUE)清理本DLL模块的当前线程的线程局部数据。
另外,它定义一个_AFX_TERM_DLL_STATE类型的静态变量,在DLL退出时该变量被销毁,导致其析构函数被调用。析构函数完成如下动作:
调用AfxTermateLocalData(NULL, TRUE);调用AfxCriticlTerm结束关键变量;调用AfxTlsRealease。
(5)线程终止时
当使用AFxBeginThread创建的线程终止时,将调用AfxTermThread(HANDLE hInstance)作结束线程的清理工作(参数为NULL):销毁临时MFC对象,销毁本线程的线程局部变量,等等。
另外,当DLL模块和AfxBeginThread创建的线程分离时,也调用AfxTermThread(hInstance),参数是模块的句柄,销毁临时MFC对象,销毁本线程在本DLL创建的线程局部变量,等等。所以,AfxTermThread可能被调用两次。
最后,CThreadLocal和CProcessLocal的实例将被销毁,析构函数被调用:如果MFC线程局部存储空间的槽m_nSlot所指的线程局部对象还没有销毁,则销毁它。
_afxThreadData在MFC DLL的RawDllMain或者随着_AFX_TERM_APP_STATE析构函数的调用,_afxThreadData所指对象被销毁。_afxThreadData所指对象销毁之后,所有的状态相关的内存都被释放。
更多精彩
赞助商链接