
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也可以这样使用的,但是一直没找到我想到的结果