Don't call SetDllDirectory() when loading dynamic libraries in wxMSW.

SetDllDirectory() modifies the per-process DLL loading behaviour which is
already unexpected as it can affect other threads, running code completely
unrelated to wxWidgets, but, even worse, we can't undo its effect as calling
SetDllDirectory(NULL) as we used to discarded any changes to the DLL directory
done by the program itself, while restoring the result of GetDllDirectory()
would never restore the "compatible" algorithm for DLL search used by default.

So the simplest, and the only 100% correct solution, is to not call this
function at all from here and call it from some higher level code only, either
in the user application or wxPython itself.

Closes #15534.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74937 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2013-10-05 15:05:32 +00:00
parent f58377dde1
commit 5dcfc82cca

View File

@@ -236,51 +236,7 @@ wxDynamicLibrary::RawLoad(const wxString& libname, int flags)
if (flags & wxDL_GET_LOADED)
return ::GetModuleHandle(libname.t_str());
// Explicitly look in the same path as where the main wx HINSTANCE module
// is located (usually the executable or the DLL that uses wx). Normally
// this is automatically part of the default search path but in some cases
// it may not be, such as when the wxPython extension modules need to load
// a DLL, but the intperpreter executable is located elsewhere. Doing
// this allows us to always be able to dynamically load a DLL that is
// located at the same place as the wx modules.
wxString modpath, path;
::GetModuleFileName(wxGetInstance(),
wxStringBuffer(modpath, MAX_PATH+1),
MAX_PATH);
wxFileName::SplitPath(modpath, &path, NULL, NULL);
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
if (s_pfnSetDllDirectory)
{
s_pfnSetDllDirectory(NULL);
}
return handle;
return ::LoadLibrary(libname.t_str());
}
/* static */