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
This commit is contained in:
Dimitri Schoolwerth 2011-08-30 15:20:05 +00:00
parent 2669319136
commit 685a9fa61d

View 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;
}