Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1072469
  • 博文数量: 243
  • 博客积分: 3053
  • 博客等级: 中校
  • 技术积分: 2975
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-02 21:11
文章分类

全部博文(243)

文章存档

2013年(2)

2012年(20)

2011年(5)

2010年(114)

2009年(102)

我的朋友

分类:

2010-12-08 18:19:25

核心MFC DLL  

所谓核心MFC DLL,就是MFC核心类库形成的DLL,通常说动态链接到MFC,就是指核心MFC DLL。

核心MFC DLL实际上也是一种扩展DLL,因为它定义了自己的扩展模块状态coreDLL,实现了自己的DllMain函数,使用AfxInitExtensionModule初始化核心DLL的扩展模块状态coreDLL,并且DllMain还创建了CDynLinkLibrary,把核心DLL的扩展模块状态coreDLL链接到当前应用程序的模块状态中。所有这些,都符合扩展DLL的处理标准。

但是,核心MFC DLL是一种特殊的扩展DLL,因为它定义和实现了MFC类库,模块状态、线程状态、进程状态、状态管理和使用的机制就是核心MFC DLL定义和实现的。例如核心MFC DLL定义和输出的模块状态变量,即_afxBaseModuleState,就是动态链接到MFC的DLL的应用程序的模块状态。

但是MFC DLL不作为独立的模块表现出来,而是把自己作为一个扩展模块来处理。当应用程序动态链接到MFC DLL时,MFC DLL把自己的扩展模块状态coreDLL链接到模块状态afxBaseModuleState,模块状态的成员变量m_hCurrentInstanceHandle指定为应用程序的句柄。当规则DLL动态链接到MFC DLL时,由规则DLL的DllMain把核心MFC DLL的扩展模块状态coreDLL链接到规则DLL的模块状态afxModuleState中,模块状态afxModuleState的m_hCurrentInstanceHandle指定为规则DLL的句柄。

关于afxModuleState和规则DLL的模块状态,见下一节的讨论。

动态链接的规则DLL的模块状态的实现

 

在本节中,动态链接到MFC DLL(定义了_AFXDLL)的规则DLL在下文简称为规则DLL。

(1)规则DLL的模块状态的定义

规则DLL有自己的模块状态_afxModuleState,它是一个静态变量,定义如下:

static _AFX_DLL_MODULE_STATE afxModuleState;

_AFX_DLL_MODULE_STATE的基类是AFX_MODULE_STATE。

在前面的模块状态切换中提到的AfxGetStaticModuleState函数,其定义和实现如下:

_AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState()

{

AFX_MODULE_STATE* pModuleState = &afxModuleState;

return pModuleState;

}

它返回规则DLL的模块状态afxModuleState。

规则DLL的内部函数使用afxModuleState作为模块状态;输出函数在被调用的时候首先切换到该模块状态,然后进一步处理。

(2)规则DLL的模块状态的初始化

从用户角度来看,动态链接到MFC DLL的规则DLL不需要DllMain函数,只要提供CWinApp对象即可。其实,MFC内部是在实现扩展DLL的方法基础上来实现规则DLL的,它不仅为规则DLL提供了DllMain函数,而且规则DLL也有扩展DLL模块状态controlDLL。

顺便指出,和扩展DLL相比,规则DLL有一个CWinApp(或其派生类)应用程序对象和一个模块状态afxModuleState。应用程序对象是全局对象,所以在进入规则DLL的DllMain之前已经被创建,DllMain可以调用它的初始化函数InitInstance。模块状态afxModuleState是静态全局变量,也在进入DllMain之前被创建,DllMain访问模块状态时得到的就是该变量。扩展DLL是没有CWinApp对象和模块状态的,它只能使用应用程序或者规则DLL的CWinApp对象和模块状态。

由于核心MFC DLL的DllMain被调用的时候,访问的必定是应用程序的模块状态,要把核心DLL的扩展模块状态链接到规则DLL的模块状态中,必须通过规则DLL的DllMain来实现。

规则DLL的DllMain(MFC内部实现)把参数1表示的模块和资源句柄通过AfxWinInit函数保存到规则DLL的模块状态中。顺便指出,WinMain也通过AfxWinInit函数把资源和模块句柄保存到应用程序的模块状态中。

然后,该DllMain还创建了一个CDynLinkLibrary对象,把核心MFC DLL的扩展模块 coreDLL链接到本DLL的模块状态afxModuleState。

接着,DllMain得到自己的应用程序对象并调用InitInstance初始化。

之后,DllMain创建另一个CDynLinkLibrary对象,把本DLL的扩展模块controlDLL链接到本DLL的模块状态afxModuleState。

(3)使用规则DLL的应用程序可不需要CwinApp对象

规则DLL的资源等是由DLL内部使用的,不存在资源或者CRuntimeClass类输出的问题,这样调用规则DLL的程序不必具有模块状态,不必关心规则DLL的内部实现,不一定需要CwinApp对象,所以可以是任意Win32应用程序,

还有一点需要指出,DllMain也是规则DLL的入口点,在它之前,调用DllMain的RawDllMain已经切换了模块状态,RawDllMain是静态链接的,所以不必考虑状态切换。

阅读(934) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~