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:
@@ -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 */
|
||||
|
Reference in New Issue
Block a user