// Name: src/msw/dlmsw.cpp
// Purpose: Win32-specific part of wxDynamicLibrary and related classes
// Author: Vadim Zeitlin
-// Modified by:
+// Modified by: Suzumizaki-kimitaka 2013-04-09
// Created: 2005-01-10 (partly extracted from common/dynlib.cpp)
-// RCS-ID: $Id$
// Copyright: (c) 1998-2005 Vadim Zeitlin <vadim@wxwindows.org>
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/msw/debughlp.h"
#include "wx/filename.h"
-const wxString wxDynamicLibrary::ms_dllext(wxT(".dll"));
+// defined for TDM's GCC/mingw32
+#ifndef PCTSTR
+#define PCTSTR LPCTSTR
+#endif
// ----------------------------------------------------------------------------
// private classes
wxVersionDLL *verDLL;
};
- // TODO: fix EnumerateLoadedModules() to use EnumerateLoadedModules64()
- #ifdef __WIN64__
- typedef DWORD64 DWORD_32_64;
- #else
- typedef DWORD DWORD_32_64;
- #endif
-
static BOOL CALLBACK
- EnumModulesProc(PCSTR name, DWORD_32_64 base, ULONG size, void *data);
+ EnumModulesProc(PCTSTR name, DWORD64 base, ULONG size, PVOID data);
};
// ============================================================================
#endif // UNICODE/ANSI
#define LOAD_VER_FUNCTION(name) \
- m_pfn ## name = (name ## _t)m_dll.GetSymbol(wxT(#name SUFFIX)); \
+ m_pfn ## name = (name ## _t)m_dll.GetSymbol(wxT(#name SUFFIX)); \
if ( !m_pfn ## name ) \
{ \
m_dll.Unload(); \
/* static */
BOOL CALLBACK
-wxDynamicLibraryDetailsCreator::EnumModulesProc(PCSTR name,
- DWORD_32_64 base,
+wxDynamicLibraryDetailsCreator::EnumModulesProc(PCTSTR name,
+ DWORD64 base,
ULONG size,
- void *data)
+ PVOID data)
{
EnumModulesProcParams *params = (EnumModulesProcParams *)data;
wxDynamicLibraryDetails *details = new wxDynamicLibraryDetails;
// fill in simple properties
- details->m_name = wxString::FromAscii(name);
+#ifdef UNICODE
+ details->m_name = name;
+#else
+ details->m_name = wxString(name, wxConvLocal);
+#endif
details->m_address = wxUIntToPtr(base);
details->m_length = size;
// to get the version, we first need the full path
- const HMODULE
- hmod = wxDynamicLibrary::MSWGetModuleHandle(name, details->m_address);
+ const HMODULE hmod = wxDynamicLibrary::MSWGetModuleHandle
+ (
+ details->m_name,
+ details->m_address
+ );
if ( hmod )
{
wxString fullname = wxGetFullModuleName(hmod);
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;
}
params.dlls = &dlls;
params.verDLL = &verDLL;
- // Note that the cast of EnumModulesProc is needed because the type of
- // PENUMLOADED_MODULES_CALLBACK changed: in old SDK versions its first
- // argument was non-const PSTR while now it's PCSTR. By explicitly
- // casting to whatever the currently used headers require we ensure
- // that the code compilers in any case.
- if ( !wxDbgHelpDLL::EnumerateLoadedModules
+ if ( !wxDbgHelpDLL::EnumerateLoadedModulesT
(
::GetCurrentProcess(),
- (PENUMLOADED_MODULES_CALLBACK)
wxDynamicLibraryDetailsCreator::EnumModulesProc,
¶ms
) )
{
- wxLogLastError(wxT("EnumerateLoadedModules"));
+ wxLogLastError(wxT("EnumerateLoadedModulesT"));
}
}
#endif // wxUSE_DBGHELP
}
/* static */
-WXHMODULE wxDynamicLibrary::MSWGetModuleHandle(const char *name, void *addr)
+WXHMODULE wxDynamicLibrary::MSWGetModuleHandle(const wxString& name, void *addr)
{
// we want to use GetModuleHandleEx() instead of usual GetModuleHandle()
// because the former works correctly for comctl32.dll while the latter
// GetModuleHandleEx() is only available under XP and later, coincidence?)
// check if we can use GetModuleHandleEx
- typedef BOOL (WINAPI *GetModuleHandleEx_t)(DWORD, LPCSTR, HMODULE *);
+ typedef BOOL (WINAPI *GetModuleHandleEx_t)(DWORD, LPCTSTR, HMODULE *);
static const GetModuleHandleEx_t INVALID_FUNC_PTR = (GetModuleHandleEx_t)-1;
{
wxDynamicLibrary dll(wxT("kernel32.dll"), wxDL_VERBATIM);
s_pfnGetModuleHandleEx =
- (GetModuleHandleEx_t)dll.RawGetSymbol(wxT("GetModuleHandleExA"));
+ (GetModuleHandleEx_t)dll.GetSymbolAorW(wxT("GetModuleHandleEx"));
// dll object can be destroyed, kernel32.dll won't be unloaded anyhow
}
// flags are GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT |
// GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
HMODULE hmod;
- if ( s_pfnGetModuleHandleEx(6, (char *)addr, &hmod) && hmod )
+ if ( s_pfnGetModuleHandleEx(6, (LPCTSTR)addr, &hmod) && hmod )
return hmod;
}
- // Windows CE only has Unicode API, so even we have an ANSI string here, we
- // still need to use GetModuleHandleW() there
-#ifdef __WXWINCE__
- return ::GetModuleHandleW(wxConvLibc.cMB2WC(name).data());
-#else
- return ::GetModuleHandleA((char *)name);
-#endif
+ return ::GetModuleHandle(name.t_str());
}
#endif // wxUSE_DYNLIB_CLASS