From a63ca3fa106f4b0f9776bf2004661ef6dec2c0c6 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 28 Apr 2016 14:09:32 -0700 Subject: Implement QLibrary::PreventUnloadHint for Windows It's interesting that the HMODULE/HINSTANCE pointer points to something in the actual module that got loaded, so we can use its value as "address of something in the module" for GetModuleHandleEx. The "PIN" flag tells the Windows DLL loader to never unload. Change-Id: Ifea6e497f11a461db432ffff1449a2169eb6293e Reviewed-by: Friedemann Kleint Reviewed-by: Kai Koehne Reviewed-by: Joerg Bornemann --- src/corelib/plugin/qlibrary_win.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src/corelib/plugin/qlibrary_win.cpp') diff --git a/src/corelib/plugin/qlibrary_win.cpp b/src/corelib/plugin/qlibrary_win.cpp index deec54db0a..95e5afa837 100644 --- a/src/corelib/plugin/qlibrary_win.cpp +++ b/src/corelib/plugin/qlibrary_win.cpp @@ -148,6 +148,16 @@ bool QLibraryPrivate::load_sys() else qualifiedFileName = dir.filePath(moduleFileName); #endif // !Q_OS_WINRT + + if (loadHints() & QLibrary::PreventUnloadHint) { + // prevent the unloading of this component + HMODULE hmod; + bool ok = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_PIN | + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, + reinterpret_cast(pHnd), + &hmod); + Q_ASSERT(!ok || hmod == pHnd); + } } return (pHnd != 0); } -- cgit v1.2.3