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

全部博文(243)

文章存档

2013年(2)

2012年(20)

2011年(5)

2010年(114)

2009年(102)

我的朋友

分类:

2010-12-08 18:16:54

2)DLL的模

 7.3.1指出DLL实现遵循五条规则此,首先在DLL实现文件里,定AFX_EXTENSION_MODULE型的静态扩展模块变量,然后在DllMain入口函数里使用AfxInitExtension初始化展模块变量,并且实现出一个初始化函数供DLL的使用者用。

使用者必一个CWinApp象,通常在它的InitInstance函数中DLL提供的初始化函数。

一般用以下的几段代完成上述任。首先是展模块变量的定和初始化:

static AFX_EXTENSION_MODULE extensionDLL;

DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)

{

if (dwReason == DLL_PROCESS_ATTACH)

{

// Extension DLL one-time initialization

if (!AfxInitExtensionModule(extensionDLL,hInstance))

return 0;

……

}

}

然后是DLL的初始化函数,假定初始化函数命名InitMyDllInitMyDll被定义为“C”接的全局函数,并且被出。

// wire up this DLL into the resource chain

extern “C” void WINAPI InitMyDll()

{

CDynLinkLibrary* pDLL = new

CDynLinkLibrary(extensionDLL, TRUE);

ASSERT(pDLL != NULL);

...

}

最后是用者的理,假定在用程象的InitInstance函数中用初始化函数:

BOOL CMyApp::InitInstance()

{

InitMyMyDll();

}

上述些代只有在动态链接到MFC DLL才有用。下面,对这些代码进行分析和解

_AFX_EXTENSION_MODULE

在分析代之前,先讨论描述展模_AFX_EXTENSION_MODULE_AFX_EXTENSION_MODULE没有基,其定如下:

struct AFX_EXTENSION_MODULE

{

BOOL bInitialized;

HMODULE hModule;

HMODULE hResource;

CRuntimeClass* pFirstSharedClass;

COleObjectFactory* pFirstSharedFactory;

};

其中:

第一个域表示该结量是否已被初始化了;

第二个域用来保存DLL的模句柄;

第三个域用来保存DLL源句柄;

第四个域用来保存DLL出的CRuntimeClass

第五个域用来保存DLLOLE Factory

该结构用来描述一个DLL的模信息,一个DLL都要定一个该类型的静态变量,例如extensionDLL

DllMain中,AfxInitExtensionModule函数来初始化本DLL的静态变该变(展模),如extensionDLL。函数AfxInitExtensionModule原型如下:

BOOL AFXAPI AfxInitExtensionModule(

AFX_EXTENSION_MODULE& state, HMODULE hModule)

其中:

参数1DllMain传递给它的DLL的模,如extensionDLL

参数2DllMain传递给它的模句柄。

AfxInitExtensionModule函数主要作以下事情:

1)把DLL的模句柄hModule源句柄hModule保存到参数state的成员变hModulehResource中;

2)把当前模m_classList列表的保存到state的成员变pFirstSharedClass中,m_classInit头设m_pClassInit。在DLL块进DllMain之前,如果该扩展模构造了静AFX_CLASSINIT象,在初始化把有CRuntimeClass信息保存在当前模(注意不是DLL,而是用程序模)的m_classList列表中。因此,DLL初始化的CRuntimeClass信息从模m_classList存到展模statepFirstSharedClass中,模m_classInitDLL前的状

CRuntimeclass信息和AFX_CLASSINIT象的构造,在3.3.1经讨论过。一个DLL在初始化,如果需要出它的CRuntimeClass象,就可以使用相CRuntimeClass象定一个静AFX_CLASSINIT象,而不一定要使用IMPLEMENT_SERIAL宏。当然,可以序列化的必定致可以出的CRuntimeClass象。

3)若支持OLE,把当前模m_factoryList保存到state的成员变pFirstSharedFactory中。m_factoryList头设m_m_pFactoryInit

4这样经过初始化之后,DLL包含了DLL的模句柄、源句柄、本模初始化的CRuntimeClass等等。

DLL的初始化函数将使用展模信息。下面,讨论初始化函数的作用。

 

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