AFX_EXTENSION_MODULE结构

AFX_EXTENSION_MODULE 结构具有如下形式:
struct AFX_EXTENSION_MODULE
{
  BOOL bInitialized;
  HMODULE hModule;
  HMODULE hResource;
  CRuntimeClass* pFirstSharedClass;
  COleObjectFactory* pFirstSharedFactory;
};AFX_EXTENSION_MODULE
被用在MFC扩展DLL的初始化过程中,用于保存扩展DLL模块的状态。

成员:
bInitialized如果DLL模块已经用AfxInitExtensionModule初始化了,则为TRUE。
hModule指定了DLL模块的句柄。
hResource指定了DLL的自定义资源模块的句柄。
pFirstSharedClass指向有关DLL模块的第一个运行时类的信息(CRuntimeClass结构)的指针。用于提供运行时类列表的开始部分。
pFirstSharedFactory指向DLL模块的第一个对象工厂(COleObjectFactory对象)的指针。用于提供类工厂列表的开始部分。

注释:
MFC扩展DLL需要在它们的DllMain函数中做两件事情:
·调用AfxInitExtensionModule并检查返回值。
·如果DLL要引出CRuntimeClass对象或者拥有它自己的资源,就创建一个CDynLinkLibrary对象。
AFX_EXTENSION_MODULE结构被用于保存扩展DLL模块状态的一个备份,包括运行时对象的一个拷贝,它已经在进入DllMain函数之前被扩展DLL作为常规静态对象构造过程的一部分初始化过了。例如:
static AFX_EXTENSION_MODULE extensionDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
  // 初始化这个DLL的扩展模块
  VERIFY(AfxInitExtensionModule(extensionDLL, hInstance));
}
AFX_EXTENSION_MODULE结构中保存的模块信息可以被拷贝到CDynLinkLibrary对象中。例如:
// CDynLinkLibrary 类
IMPLEMENT_DYNAMIC(CDynLinkLibrary, CCmdTarget)
// 构造函数
CDynLinkLibrary::CDynLinkLibrary(AFX_EXTENSION_MODULE& state, BOOL bSystem)
{
  #ifndef _AFX_NO_OLE_SUPPORT
     m_factoryList.Construct(offsetof(COleObjectFactory, m_pNextFactory));
  #endif
  m_classList.Construct(offsetof(CRuntimeClass, m_pNextClass));
  // 从AFX_EXTENSION_MODULE结构中拷贝信息
  ASSERT(state.hModule != NULL);
  m_hModule = state.hModule;
  m_hResource = state.hResource;
  m_classList.m_pHead = state.pFirstSharedClass;
  #ifndef _AFX_NO_OLE_SUPPORT
     m_factoryList.m_pHead = state.pFirstSharedFactory;
  #endif
  m_bSystem = bSystem;
}

请参阅:
AfxInitExtensionModule, AfxTermExtensionModule