您的位置:首页 > 其它

MFC规则dll中获取当前模块句柄

2013-08-23 21:26 288 查看
对于普通规则的Dll,有需要的情况下通常会在DllMain中保存第一个参数hInstance的值,而MFC规则dll没有DllMain(准确来说是由MFC框架封装了),那该怎么拿到呢?

有人说GetModuleHandle(lpDllName)酱紫方法可以拿到。但是考虑一个问题,如果dll名字呗改了(极少数情况。。。),应该有种更好的方法。我们看MFC中给出的DllMain:

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\dllinit.cpp :

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
try
{
if (dwReason == DLL_PROCESS_ATTACH)
{

#ifdef _AFX_OLE_IMPL
BOOL bRegister = !coreDLL.bInitialized;

// shared initialization
AFX_MODULE_STATE* pModuleState = _AfxGetOleModuleState();
pModuleState->m_hCurrentInstanceHandle= hInstance;
pModuleState->m_hCurrentResourceHandle= hInstance;
pModuleState->m_pClassInit = pModuleState->m_classList.GetHead();
pModuleState->m_pFactoryInit = pModuleState->m_factoryList.GetHead();
#endif

我们发现,hInstance是被保存到 pModuleState中的这两个成员里面的:
m_hCurrentInstanceHandle
m_hCurrentResourceHandle
刚好MFC有个函数:
AfxGetModuleState();

所以我们可以酱紫拿到hInstance:

BOOL CMFC_Handle_TestApp::InitInstance()
{
CWinApp::InitInstance();
AFX_MODULE_STATE* state = AfxGetModuleState();
cout << state->m_hCurrentInstanceHandle<< endl;
return TRUE;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: