![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
BOOL WINAPI DllMain ( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved )
{
// 分别处理各种通知
switch ( fdwReason )
{
case DLL_PROCESS_ATTACH:
// 为新进程初始化,只能进行1次
// 如果加载失败则返回FALSE
MessageBox( 0 , TEXT( " DLL_PROCESS_ATTACH " ), TEXT( "" ), MB_OK);
break ;
case DLL_THREAD_ATTACH:
::MessageBox( 0 , TEXT( " DLL_THREAD_ATTACH " ), TEXT( "" ), MB_OK);
// 执行线程初始化操作
break ;
case DLL_THREAD_DETACH:
::MessageBox( 0 , TEXT( " DLL_THREAD_DETACH " ), TEXT( "" ), MB_OK);
// 执行线程清理操作
break ;
case DLL_PROCESS_DETACH:
// 执行清理操作
::MessageBox( 0 , TEXT( " DLL_PROCESS_DETACH " ), TEXT( "" ), MB_OK);
break ;
}
return TRUE;
}
俩个测试代码
DWORD WINAPI MyThreadFunc(LPVOID p)
{
return 0 ;
}
void CDllMainDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
HMODULE h;
h = LoadLibrary(TEXT( " DLLSample.dll " ));
DWORD ThreadId;
CloseHandle(CreateThread(NULL, 0 , & MyThreadFunc, NULL, 0 , & ThreadId));
// FreeLibrary(h);
}
void CDllMainDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
DWORD ThreadId;
CloseHandle(CreateThread(NULL, 0 , & MyThreadFunc, NULL, 0 , & ThreadId));
}
DLL_PROCESS_ATTACH 进程第一次加载DLL时会触发
DLL_PROCESS_DETACH 1 进程已经加载DLL 2 进程卸载DLL(包括进程关闭) 3 非使用TerminateProcess 函数关闭进程
DLL_THREAD_DETACH 1 进程已经加载DLL 2 创建新线程
DLL_THREAD_DETACH 1 进程已经加载DLL 2 ExitThread撤消线程 3 非使用TerminateThread函数关闭进程
本来DELPHI也可以这样使用的,但是一直没找到我想到的结果