]> git.saurik.com Git - wxWidgets.git/commitdiff
implement wxLoadedDLL, a safer alternative to wxDL_GET_LOADED (closes #10208)
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 17 Dec 2008 22:19:41 +0000 (22:19 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 17 Dec 2008 22:19:41 +0000 (22:19 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57405 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dynlib.h
src/msw/app.cpp
src/msw/datecontrols.cpp
src/msw/window.cpp

index 3d31beeb80aeaae7e6daa6143b5ae00b04a8410c..24f1020b504e4ca8e191ebaa120bd92cc6c68cc3 100644 (file)
@@ -80,7 +80,9 @@ enum wxDLFlags
 
     wxDL_QUIET      = 0x00000020,   // don't log an error if failed to load
 
-    // this flag is dangerous, for internal use of wxMSW only, don't use
+    // this flag is dangerous, for internal use of wxMSW only, don't use at all
+    // and especially don't use directly, use wxLoadedDLL instead if you really
+    // do need it
     wxDL_GET_LOADED = 0x00000040,   // Win32 only: return handle of already
                                     // loaded DLL or NULL otherwise; Unload()
                                     // should not be called so don't forget to
@@ -376,6 +378,28 @@ protected:
     DECLARE_NO_COPY_CLASS(wxDynamicLibrary)
 };
 
+#ifdef __WXMSW__
+
+// ----------------------------------------------------------------------------
+// wxLoadedDLL is a MSW-only internal helper class allowing to dynamically bind
+// to a DLL already loaded into the project address space
+// ----------------------------------------------------------------------------
+
+class wxLoadedDLL : public wxDynamicLibrary
+{
+public:
+    wxLoadedDLL(const wxString& dllname)
+        : wxDynamicLibrary(dllname, wxDL_GET_LOADED | wxDL_VERBATIM | wxDL_QUIET)
+    {
+    }
+
+    ~wxLoadedDLL()
+    {
+        Detach();
+    }
+};
+
+#endif // __WXMSW__
 
 // ----------------------------------------------------------------------------
 // Interesting defines
index 767caedf5e1d13bea5dd584c58951f38fa43fcbb..646470fe6fcd21dea007084481d6c9178983f629 100644 (file)
@@ -917,10 +917,7 @@ int wxApp::GetComCtl32Version()
         // depending on the OS version and the presence of the manifest, it can
         // be either v5 or v6 and instead of trying to guess it just get the
         // handle of the already loaded version
-        wxDynamicLibrary dllComCtl32(_T("comctl32.dll"),
-                                     wxDL_VERBATIM |
-                                     wxDL_QUIET |
-                                     wxDL_GET_LOADED);
+        wxLoadedDLL dllComCtl32(_T("comctl32.dll"));
         if ( !dllComCtl32.IsLoaded() )
         {
             s_verComCtl32 = 0;
@@ -958,9 +955,6 @@ int wxApp::GetComCtl32Version()
                 }
             }
         }
-
-        // we shouldn't unload it here as we didn't really load it above
-        dllComCtl32.Detach();
     }
 
     return s_verComCtl32;
index 0ea7e786a1a7cbb2a9b208e8296aa00bd7731b4d..9e71c5f8fcfe6d5737a6ab5b27d79119f3c43af4 100644 (file)
@@ -68,12 +68,8 @@ bool wxMSWDateControls::CheckInitialization()
         icex.dwICC = ICC_DATE_CLASSES;
 
         // see comment in wxApp::GetComCtl32Version() explaining the
-        // use of wxDL_GET_LOADED
-        wxDynamicLibrary dllComCtl32(_T("comctl32.dll"),
-                                     wxDL_VERBATIM |
-                                     wxDL_QUIET |
-                                     wxDL_GET_LOADED);
-
+        // use of wxLoadedDLL
+        wxLoadedDLL dllComCtl32(_T("comctl32.dll"));
         if ( dllComCtl32.IsLoaded() )
         {
             wxLogNull noLog;
@@ -81,8 +77,6 @@ bool wxMSWDateControls::CheckInitialization()
             typedef BOOL (WINAPI *ICCEx_t)(INITCOMMONCONTROLSEX *);
             wxDYNLIB_FUNCTION( ICCEx_t, InitCommonControlsEx, dllComCtl32 );
 
-            dllComCtl32.Detach();
-
             if ( pfnInitCommonControlsEx )
             {
                 s_initResult = (*pfnInitCommonControlsEx)(&icex);
index b147823bea98ad45e6c5cb4c4f8467bd2209e6ab..85acab831e8568ca6af40c4d6c4f11a74c57f2c4 100644 (file)
@@ -5289,11 +5289,8 @@ bool wxWindowMSW::HandleMouseMove(int x, int y, WXUINT flags)
             if ( !s_initDone )
             {
                 // see comment in wxApp::GetComCtl32Version() explaining the
-                // use of wxDL_GET_LOADED
-                wxDynamicLibrary dllComCtl32(_T("comctl32.dll"),
-                                             wxDL_VERBATIM |
-                                             wxDL_QUIET |
-                                             wxDL_GET_LOADED);
+                // use of wxLoadedDLL
+                wxLoadedDLL dllComCtl32(_T("comctl32.dll"));
                 if ( dllComCtl32.IsLoaded() )
                 {
                     s_pfn_TrackMouseEvent = (_TrackMouseEvent_t)
@@ -5301,10 +5298,6 @@ bool wxWindowMSW::HandleMouseMove(int x, int y, WXUINT flags)
                 }
 
                 s_initDone = true;
-
-                // we shouldn't unload comctl32.dll here as we didn't really
-                // load it above
-                dllComCtl32.Detach();
             }
 
             if ( s_pfn_TrackMouseEvent )