AfxInitExtensionModule和AfxTermExtensionModule

来源:互联网 发布:苹果手机解压软件 编辑:程序博客网 时间:2024/05/29 14:05

一个很好的API查询网站 www.apihome.cn

AfxInitExtensionModule

BOOL AFXAPI AfxInitExtensionModule( AFX_EXTENSION_MODULE& state, HMODULE hModule );

返回值:
如果成功地初始化了扩展DLL,则返回TRUE;否则返回FALSE。

参数:state对初始化后包含了扩展DLL模块状态的AFX_EXTENSION_MODULE结构的引用。这个状态中包含了扩展DLL在进入DllMain之前作为一般静态对象构造过程的一部分而初始化的运行类对象的拷贝。hModule扩展DLL模块的句柄。
说明:
在扩展DLL的DllMain中调用此函数以初始化DLL。例如:
static AFX_EXTENSION_MODULE extensionDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
  if(dwReason == DLL_PROCESS_ATTACH)
  {
    // 扩展DLL 一次性初始化
    if(!AfxInitExtensionModule(extensionDLL, hInstance)) return 0;
    ...
  }
}
AfxInitExtensionModule生成DLL的HMODULE的一个拷贝,并捕捉DLL的运行类(CRuntimeClass结构)和它的对象工厂(COleObjectFactory对象)以供创建CDynLinkLibrary时使用。
MFC的扩展DLL必须在它们的DllMain函数中做两件事情:·调用AfxInitExtensionModule 并检验返回值。·如果DLL要引出CRuntimeClass对象或者具有它自己的资源,则创建一个CDynLinkLibrary对象。当每个进程与扩展DLL分离时(这发生在进程退出,或者因为调用了AfxFreeLibrary,DLL被卸载时),你可以调用AfxTermExtensionModule来清除扩展DLL。

请参阅:AfxTermExtensionModule

AfxTermExtensionModule

void AFXAPI AfxTermExtensionModule(
     AFX_EXTENSION_MODULE& state,
     BOOL bAll = FALSE
    );

参数:
state对一个AFX_EXTENSION_MODULE结构的引用,其中包含了扩展DLL模块的状态。bAll如果为TRUE,清除所有的扩展DLL模块。否则,只清除当前的DLL模块。
说明:
调用这个函数,使每个进程与DLL分离(这在进程退出时发生,或者是由于调用了AfxFreeLibrary,DLL被卸载)的时候MFC可以清除扩展DLL。
AfxTermExtensionModule将删除所有与模块相连的局部内容并从消息映射中除去所有的入口。例如:
static AFX_EXTENSION_MODULE extensionDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
  if(dwReason == DLL_PROCESS_ATTACH)
  {
    // 扩展 DLL 的一次性初始化
    if(!AfxInitExtensionModule( extensionDLL, hInstance)) return 0;
    // 任务:执行其它的初始化工作
  }
  else if(dwReason == DLL_PROCESS_DETACH)
  {
    // 扩展DLL的每个进程结束
    AfxTermExtensionModule(extensionDLL);
    // 任务:执行其它的清除工作。
  }
  return 1; // 完成
}
如果你的应用程序动态地载入、释放扩展DLL,确保调用了AfxTermExtensionModule。因为大多数扩展DLL不是动态载入(通常,它们与其引入库相连接)的,通常没有必要调用AfxTermExtensionModule。
MFC的扩展DLL需要在它们的DllMain中调用AfxInitExtensionModule。如果DLL将输出CRuntimeClass对象或者具有它自己的资源,你也需要在DllMain中创建CDynLinkLibrary对象。









0 0
原创粉丝点击