From 685a9fa61d56606cadb99a0a34773ecfb9865fa8 Mon Sep 17 00:00:00 2001 From: Dimitri Schoolwerth Date: Tue, 30 Aug 2011 15:20:05 +0000 Subject: [PATCH 1/1] Fixed dlmsw.cpp compilation with older SDKs and at run-time for systems prior to XP SP1. 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 | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/msw/dlmsw.cpp b/src/msw/dlmsw.cpp index 33a55b8ce8..0bb76d72db 100644 --- a/src/msw/dlmsw.cpp +++ b/src/msw/dlmsw.cpp @@ -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; } -- 2.45.2