![]()
/*lpReserved*/)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
BOOL bResult = FALSE;
#ifdef _AFXDLL
// wire up resources from core DLL
AfxCoreInitModule();
#endif
_AFX_THREAD_STATE* pState = AfxGetThreadState();
AFX_MODULE_STATE* pPrevModState = pState->m_pPrevModuleState;
// Initialize DLL's instance(/module) not the app's
if (!AfxWinInit(hInstance, NULL, _T("
"), 0))
{
AfxWinTerm();
goto Cleanup;
// Init Failed
}
// initialize the single instance DLL
CWinApp* pApp; pApp = AfxGetApp();
//这里可以对 DLL_PROCESS_ATTACH 相应
if (pApp != NULL && !pApp->InitInstance())
{
pApp->ExitInstance();
AfxWinTerm();
goto Cleanup;
// Init Failed
}
pState->m_pPrevModuleState = pPrevModState;
#ifdef _AFXDLL
// wire up this DLL into the resource chain
VERIFY(AfxInitExtensionModule(controlDLL, hInstance));
CDynLinkLibrary* pDLL; pDLL =
new CDynLinkLibrary(controlDLL);
ASSERT(pDLL != NULL);
#
else
AfxInitLocalData(hInstance);
#endif
bResult = TRUE;
Cleanup:
pState->m_pPrevModuleState = pPrevModState;
#ifdef _AFXDLL
// restore previously-saved module state
VERIFY(AfxSetModuleState(AfxGetThreadState()->m_pPrevModuleState) ==
&afxModuleState);
DEBUG_ONLY(AfxGetThreadState()->m_pPrevModuleState = NULL);
#endif
return bResult;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
#ifdef _AFXDLL
// set module state for cleanup
ASSERT(AfxGetThreadState()->m_pPrevModuleState == NULL);
AfxGetThreadState()->m_pPrevModuleState =
AfxSetModuleState(&afxModuleState);
#endif
CWinApp* pApp = AfxGetApp();
if (pApp != NULL)
//这里可以对DLL_PROCESS_DETACH响应
pApp->ExitInstance();
#ifdef _DEBUG
// check for missing AfxLockTempMap calls
if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
{
TRACE1("
Warning: Temp map lock count non-zero (%ld).\n",
AfxGetModuleThreadState()->m_nTempMapLock);
}
#endif
AfxLockTempMaps();
AfxUnlockTempMaps(-1);
// terminate the library before destructors are called
AfxWinTerm();
#ifdef _AFXDLL
AfxTermExtensionModule(controlDLL, TRUE);
#
else
AfxTermLocalData(hInstance, TRUE);
#endif
}
else
if (dwReason == DLL_THREAD_DETACH)
{
AFX_MANAGE_STATE(&afxModuleState);
#ifdef _DEBUG
// check for missing AfxLockTempMap calls
if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
{
TRACE1("
Warning: Temp map lock count non-zero (%ld).\n",
AfxGetModuleThreadState()->m_nTempMapLock);
}
#endif
AfxLockTempMaps();
AfxUnlockTempMaps(-1);
AfxTermThread(hInstance);
}
return TRUE;
}
// 看书后 修改一下
DLL_PROCESS_ATTACH 当DLL第一次被加载到进程中的时候 发生这个调用 当再次发生加载的时候 不会发生
DLL_PROCESS_DETACH 当DLL引用计数为1的时候发生 表示DLL要被卸载出进程了
DLL_THEAD_ATTACH 当新的线程产生的时候会发生这个事件吧
DLL_THEAD_DETACH 当有线程挂掉的时候发生这个事件
所以MFC的DLL 不处理线程的2个事件 是可以的
如果比较邪恶东西 可能会用到这个2个事件吧
DLL加载的核心编程里 说了很多 读懂后 在修改吧