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 下一页 

  关于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

  };

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

  CDynLinkLibrary构造函数的第一个参数就是经过AfxInitExtensionModule初始化后的扩展DLL的模块状态,如extensionDLL,第二个参数表示该DLL模块是否是系统模块。

  创建CDynLinkLibrary对象导致CCmdTarget和CDynLinkLibrary类的构造函数被调用。CCmdTarget的构造函数将获取模块状态并且保存在成员变量m_pModuleState中。CDynLinkLibrary的构造函数完成以下动作:


更多内容请看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)