AfxInitExtensionModule和AfxTermExtensionModule

DllMain中 AfxInitExtensionModule和AfxTermExtensionModule

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

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

参数: state对初始化后包含了扩展DLL模块状态的AFX_EXTENSION_MODULE结构的引用。这个状态中包含了扩展DLL在进入DllMain之前作为一般静态对象构造过程的一部分而初始化的运行类对象的拷贝。hModule扩展DLL模块的句柄。
说明:
在扩展DLL的DllMain中调用此函数以初始化DLL。例如:
 switch (dwReason)
 {
     case 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。

 

 

// CDLLMainHelper.h

 

#pragma once

 

class __declspec(dllexport) CDLLMainHelper{
public:
 CDLLMainHelper();
 ~CDLLMainHelper();

 

protected:
 HMODULE                 m_module;
 AFX_EXTENSION_MODULE    m_extmodule;
 CDynLinkLibrary*        m_dll;

 

public:
 HMODULE GetModule();

 

protected:
 virtual int OnProcessAttach(HINSTANCE hInstance, LPVOID lpReserved);
 virtual int OnThreadAttach(HINSTANCE hInstance, LPVOID lpReserved);
 virtual int OnThreadDetach(HINSTANCE hInstance, LPVOID lpReserved);
 virtual int OnProcessDetach(HINSTANCE hInstance, LPVOID lpReserved);

 

public:
 int DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved);
};

 

// CDLLMainHelper.cpp

 

#include "CDLLMainHelper.h"

 

CDLLMainHelper::CDLLMainHelper()
{
 m_module = NULL;
 memset(&m_extmodule, 0, sizeof(AFX_EXTENSION_MODULE));
 m_dll = NULL;
}

 

CDLLMainHelper::~CDLLMainHelper()
{
 if (m_dll){ delete m_dll; m_dll = NULL; }
}

 

HMODULE CDLLMainHelper::GetModule()
{
 if (m_extmodule.hModule)
  return m_extmodule.hModule;

 

 return (m_module);
}

 

int CDLLMainHelper::DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
 m_module = (HMODULE) hInstance;

 

 switch (dwReason){
 case DLL_PROCESS_ATTACH:
  return (OnProcessAttach(hInstance, lpReserved));
 case DLL_THREAD_ATTACH:
  return (OnThreadAttach(hInstance, lpReserved));
 case DLL_THREAD_DETACH:
  return (OnThreadDetach(hInstance, lpReserved));
 case DLL_PROCESS_DETACH:
  return (OnProcessDetach(hInstance, lpReserved));
 }

 

 return 0;
}

 

int CDLLMainHelper::OnProcessAttach(HINSTANCE hInstance, LPVOID lpReserved)
{
 if (!AfxInitExtensionModule(m_extmodule, hInstance)) return 0;
 if (m_dll){ delete m_dll; m_dll = NULL; }
 m_dll = new CDynLinkLibrary(m_extmodule);
 if (m_dll == NULL) return 0;

 

 return 1;
}

 

int CDLLMainHelper::OnThreadAttach(HINSTANCE hInstance, LPVOID lpReserved)
{
 return 1;
}

 

int CDLLMainHelper::OnThreadDetach(HINSTANCE hInstance, LPVOID lpReserved)
{
 return 1;
}

 

int CDLLMainHelper::OnProcessDetach(HINSTANCE hInstance, LPVOID lpReserved)
{
 if (m_dll){ delete m_dll; m_dll = NULL; }
 AfxTermExtensionModule(m_extmodule);

 

 return 1;
}

 

 

 

 

 

posted @ 2013-07-16 15:53  朱家牧  阅读(1842)  评论(0)    收藏  举报