STDAPI DllCanUnloadNow() { if (GetCurrentThreadId() != qAxThreadId) return S_FALSE; if (qAxLockCount()) return S_FALSE; if (!qax_ownQApp) return S_OK; // check if qApp still runs widgets (in other DLLs) QWidgetList widgets = qApp->allWidgets(); int count = widgets.count(); for (int w = 0; w < widgets.count(); ++w) { // remove all Qt generated widgets QWidget *widget = widgets.at(w); if (widget->windowType() == Qt::Desktop || widget->objectName() == QLatin1String("Qt internal tablet widget")) count--; } if (count) return S_FALSE; // no widgets left - destroy qApp if (qax_hhook) UnhookWindowsHookEx(qax_hhook); delete qApp; qax_ownQApp = false; // never allow unloading - safety net for Internet Explorer return S_FALSE; }
// Monitors the shutdown event static DWORD WINAPI MonitorProc(void* pv) { while (1) { WaitForSingleObject(hEventShutdown, INFINITE); DWORD dwWait=0; do { qAxActivity = false; dwWait = WaitForSingleObject(hEventShutdown, dwTimeOut); } while (dwWait == WAIT_OBJECT_0); // timed out if (!qAxActivity && !qAxLockCount()) // if no activity let's really bail break; } CloseHandle(hEventShutdown); PostThreadMessage(dwThreadID, WM_QUIT, 0, 0); PostQuitMessage(0); return 0; }