为什么DLL中线程中不能退出了?
操作步聚如下:
1.在调用DLL接口时,创建一个线程,并在创建完后显示窗口
handle = CreateThread(NULL, 0, _MessageManageThreadProc, NULL, 0, &dwID);
sleep(100);
ext_pInstallPluginDlg->ShowWindow(SW_SHOW);
2.线程函数中创建一个窗口,并加上消息循环
DWORD WINAPI _MessageManageThreadProc(LPVOID lpParam)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (ext_pInstallPluginDlg->GetSafeHwnd() == NULL)
{
if (!ext_pInstallPluginDlg->Create(IDD_DIALOG_INSTALL_BACK))
return -1;
}
MSG msg;
while (TRUE)
{
int bRet = GetMessage( &msg, NULL, 0, 0 );
if (bRet == -1 || bRet==0 )
{
// handle the error and possibly exit
break;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
3.在DLL退出的时候,退出这个线程
::PostThreadMessage(dwID, WM_QUIT, 0, 0);
WaitForSingleObject(handle, INFINITE);
为什么WaitForSingleObject会死掉,线程函数明明已经return了。
[解决办法]
DllMain及其调用的函数中不能等待线程结束,因为线程加载和退出都要调用DllMain,而DllMain是同步函数,在前一次调用DllMain未返回之前不会再次调用,所以死锁。
[解决办法]
入口处 DisableThreadLibraryCalls