WEB开发网
开发学院软件开发VC MFC教程(9)-- MFC的进程和线程(2) 阅读

MFC教程(9)-- MFC的进程和线程(2)

 2010-03-25 20:35:05 来源:WEB开发网   
核心提示:AfxInitExtensionModule函数主要作以下事情:(1)把扩展DLL模块的模块句柄hModule、资源句柄hModule分别保存到参数state的成员变量hModule、hResource中;(2)把当前模块状态的m_classList列表的头保存到state的成员变量pFirstSharedClass中

AfxInitExtensionModule函数主要作以下事情:

(1)把扩展DLL模块的模块句柄hModule、资源句柄hModule分别保存到参数state的成员变量hModule、hResource中;

(2)把当前模块状态的m_classList列表的头保存到state的成员变量pFirstSharedClass中,m_classInit的头设置为模块状态的m_pClassInit。在扩展DLL模块进入DllMain之前,如果该扩展模块构造了静态AFX_CLASSINIT对象,则在初始化时把有关CRuntimeClass信息保存在当前模块状态(注意不是扩展DLL模块,而是应用程序模块)的m_classList列表中。因此,扩展DLL模块初始化的CRuntimeClass信息从模块状态的m_classList中转存到扩展模块状态state的pFirstSharedClass中,模块状态的m_classInit恢复被该DLL改变前的状态。

关于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的初始化函数将使用扩展模块状态信息。下面,讨论初始化函数的作用。

扩展DLL的初始化函数

在初始化函数InitMyDll中,创建了一个动态的CDynLinkLibrary对象,并把对象指针保存在pDLL中。CDynLinkLibrary类从CCmdTarget派生,定义如下:

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<CRuntimeClass*> m_classList;

#ifndef _AFX_NO_OLE_SUPPORT

CTypedSimpleList<COleObjectFactory*> 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

};

上一页  2 3 4 5 6 7 8 9 10 11 12  下一页

Tags:MFC 教程 MFC

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接