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

全部博文(243)

文章存档

2013年(2)

2012年(20)

2011年(5)

2010年(114)

2009年(102)

我的朋友

分类:

2010-12-08 18:17:45

DLL的初始化函数  

在初始化函数InitMyDll中,建了一个动态CDynLinkLibrary象,并把象指保存在pDLL中。CDynLinkLibraryCCmdTarget派生,定如下:

class CDynLinkLibrary : public CCmdTarget

{

DECLARE_DYNAMIC(CDynLinkLibrary)

public:

// Constructor

CDynLinkLibrary(AFX_EXTENSION_MODULE& state,

BOOL bSystem = FALSE);

// Attributes

HMODULE m_hModule;

HMODULE m_hResource; // for shared resources

CTypedSimpleList m_classList;

#ifndef _AFX_NO_OLE_SUPPORT

CTypedSimpleList m_factoryList;

#endif

BOOL m_bSystem; // TRUE only for MFC DLLs

// Implementation

public:

CDynLinkLibrary* m_pNextDLL; // simple singly linked list

virtual ~CDynLinkLibrary();

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif //_DEBUG

};

CDynLinkLibrary构和AFX_EXTENSION_MODULE有一定的相似性,存在对应关系。

CDynLinkLibrary构造函数的第一个参数就是经过AfxInitExtensionModule初始化后的DLL的模,如extensionDLL,第二个参数表示DLL是否是系

CDynLinkLibraryCCmdTargetCDynLinkLibrary的构造函数被用。CCmdTarget的构造函数将取模并且保存在成员变m_pModuleState中。CDynLinkLibrary的构造函数完成以下作:

构造列表m_classListm_factoryList

把参数state的域hModulehResource制到对应的成员变m_hModulem_hResource中;

statepFirstSharedClasspFirstSharedFactory插入到m_classList列表、m_factoryList列表的表

把参数2值赋值给员变m_bSystem中;

至此,CDynLinkLibrary象已构造完。之后,CDynLinkLibrary构造函数把CDynLinkLibrary象自身添加到当前DLL用程序模或者规则DLL)的CDynLinkLibrary列表m_libraryList的表了防止多个线程修改模m_libraryList访问m_libraryList使用了同机制。

这样用模块执行完展模的初始化函数之后,就把该扩DLL源、CRuntimeClassOLE Factory接到用者的模中,形成一个表。9-8表明了这种关

合以上分析,可以知道:

DLL的模块仅仅DLLDllMain初始化函数期被使用,在些初始化完之后,DLL接到当前用模的模中,因此它所包含的源信息等也就被接到DLL用程序或者规则DLL的模中了。DLL展了用者的源等,DLL”得名的原因之一。

也正因为扩DLL没有自己的模(指AFX_MODULE_STATE象,DLL不是),而且必由有模的模来使用,所以只有动态链接到MFC用程序或者规则DLL才可以使用DLL出函数或者

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