MFC DLL 调用
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
CodeBOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*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加载的核心编程里 说了很多 读懂后 在修改吧