Казалось бы все просто и понятно, а вот что имеем:
// DLL
HANDLE h[2];
void __cdecl ThreadProc(void*)
{
SetEvent(h[0]);
}
BOOL APIENTRY DllMain(
IN HMODULE moduleHandle,
IN DWORD reasonForCall,
IN LPVOID pReserved)
{
switch (reasonForCall)
{
case DLL_PROCESS_ATTACH:
{
h[0] = CreateEvent(0,0,0,0);
h[1] = (HANDLE)_beginthread(ThreadProc,0,0);
}
break;
case DLL_PROCESS_DETACH:
{
WaitForMultipleObjects(2, h, FALSE, INFINITE); // виснет здесь
}
}
return TRUE;
}
// тест
int _tmain(int argc, _TCHAR* argv[])
{
HMODULE h = LoadLibrary(_T("dll.dll"));
FreeLibrary(h);
return 0;
}
Дело в том, что LoadLibrary и FreeLibrary выполняются так, что не успевает зайти в ThreadProc, поэтому на FreeLibrary висим. Более того, понимаю, что хэндл треда ждать в DllMain вообще бесполезно, но пусть будет (это из реальной функции ожидания завершения треда для общего случая).
Научите, пожалуйста, если не сложно и найдется время, как правильно запускать и останавливать треды! У меня иначе как используя 2 евента и 2 раза принудительно переключаясь не получается