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

来源: 作者: 2007-12-14 出处:pcdog.com

adsl  ssl  多线程  
上一页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 下一页 

  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类;

  第五个域用来保存扩展DLL的OLE Factory。

  该结构用来描述一个扩展DLL的模块状态信息,每一个扩展DLL都要定义一个该类型的静态变量,例如extensionDLL。

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

  BOOL AFXAPI AfxInitExtensionModule(

  AFX_EXTENSION_MODULE& state, HMODULE hModule)

  其中:

  参数1是DllMain传递给它的扩展DLL的模块状态,如extensionDLL;

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

  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改变前的状态。


更多内容请看PCdog.com--Fireworks教程  PPT教程  电脑入门教程专题
上一页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 下一页 
上一篇:MFC教程(10)-- 内存分配方式和调试机制
下一篇:MFC教程(9)-- MFC的进程和线程(1)