对于普通规则的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
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;
}