]> git.saurik.com Git - wxWidgets.git/commitdiff
Fixed dlmsw.cpp compilation with older SDKs and at run-time for systems prior to...
authorDimitri Schoolwerth <dimitri.schoolwerth@gmail.com>
Tue, 30 Aug 2011 15:20:05 +0000 (15:20 +0000)
committerDimitri Schoolwerth <dimitri.schoolwerth@gmail.com>
Tue, 30 Aug 2011 15:20:05 +0000 (15:20 +0000)
Kernel32's SetDllDirectory is only available since XP SP1 and as such also not available in the SDK that comes by default with for example VS6. Attempt to retrieve the function from the DLL at run-time instead. Regression since r68935.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68962 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/msw/dlmsw.cpp

index 33a55b8ce85264844abe3f1ee1e4c5b200aade67..0bb76d72db470bdca66717ab349bf1c7ec9e09bc 100644 (file)
@@ -249,12 +249,37 @@ wxDynamicLibrary::RawLoad(const wxString& libname, int flags)
                         MAX_PATH);
     
     wxFileName::SplitPath(modpath, &path, NULL, NULL);
-    ::SetDllDirectory(path.t_str());
-    
+
+    typedef BOOL (WINAPI *SetDllDirectory_t)(LPCTSTR lpPathName);
+
+    static SetDllDirectory_t s_pfnSetDllDirectory = (SetDllDirectory_t) -1;
+
+    if ( s_pfnSetDllDirectory == (SetDllDirectory_t) -1 )
+    {
+        /*
+        Should wxLoadedDLL ever not be used here (or rather, the
+        wxDL_GET_LOADED flag isn't used), infinite recursion will take
+        place (unless s_pfnSetDllDirectory is set to NULL here right
+        before loading the DLL).
+        */
+        wxLoadedDLL dllKernel("kernel32.dll");
+
+        wxDL_INIT_FUNC_AW(s_pfn, SetDllDirectory, dllKernel);
+    }
+
+    if (s_pfnSetDllDirectory)
+    {
+        s_pfnSetDllDirectory(path.t_str());
+    }
+
     wxDllType handle = ::LoadLibrary(libname.t_str());
 
     // reset the search path
-    ::SetDllDirectory(NULL);
+    if (s_pfnSetDllDirectory)
+    {
+        s_pfnSetDllDirectory(NULL);
+    }
+
     return handle;
 }