Support Unicode module names in wxDynamicLibrary::MSWGetModuleHandle().

The module names are not necessarily ASCII strings, so use wxString instead of
"char*" and W-version of GetModuleHandle() if appropriate.

See #15138.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73792 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2013-04-08 14:15:31 +00:00
parent 5b45240914
commit 252e3b2c29
2 changed files with 12 additions and 15 deletions

View File

@@ -359,7 +359,7 @@ public:
// the returned handle reference count is not incremented so it doesn't // the returned handle reference count is not incremented so it doesn't
// need to be freed using FreeLibrary() but it also means that it can // need to be freed using FreeLibrary() but it also means that it can
// become invalid if the DLL is unloaded // become invalid if the DLL is unloaded
static WXHMODULE MSWGetModuleHandle(const char *name, void *addr); static WXHMODULE MSWGetModuleHandle(const wxString& name, void *addr);
#endif // __WINDOWS__ #endif // __WINDOWS__
protected: protected:

View File

@@ -185,13 +185,16 @@ wxDynamicLibraryDetailsCreator::EnumModulesProc(PCSTR name,
wxDynamicLibraryDetails *details = new wxDynamicLibraryDetails; wxDynamicLibraryDetails *details = new wxDynamicLibraryDetails;
// fill in simple properties // fill in simple properties
details->m_name = wxString::FromAscii(name); details->m_name = name;
details->m_address = wxUIntToPtr(base); details->m_address = wxUIntToPtr(base);
details->m_length = size; details->m_length = size;
// to get the version, we first need the full path // to get the version, we first need the full path
const HMODULE const HMODULE hmod = wxDynamicLibrary::MSWGetModuleHandle
hmod = wxDynamicLibrary::MSWGetModuleHandle(name, details->m_address); (
details->m_name,
details->m_address
);
if ( hmod ) if ( hmod )
{ {
wxString fullname = wxGetFullModuleName(hmod); wxString fullname = wxGetFullModuleName(hmod);
@@ -342,7 +345,7 @@ wxDynamicLibraryDetailsArray wxDynamicLibrary::ListLoaded()
} }
/* static */ /* 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() // we want to use GetModuleHandleEx() instead of usual GetModuleHandle()
// because the former works correctly for comctl32.dll while the latter // because the former works correctly for comctl32.dll while the latter
@@ -350,7 +353,7 @@ WXHMODULE wxDynamicLibrary::MSWGetModuleHandle(const char *name, void *addr)
// GetModuleHandleEx() is only available under XP and later, coincidence?) // GetModuleHandleEx() is only available under XP and later, coincidence?)
// check if we can use GetModuleHandleEx // 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; static const GetModuleHandleEx_t INVALID_FUNC_PTR = (GetModuleHandleEx_t)-1;
@@ -359,7 +362,7 @@ WXHMODULE wxDynamicLibrary::MSWGetModuleHandle(const char *name, void *addr)
{ {
wxDynamicLibrary dll(wxT("kernel32.dll"), wxDL_VERBATIM); wxDynamicLibrary dll(wxT("kernel32.dll"), wxDL_VERBATIM);
s_pfnGetModuleHandleEx = 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 // dll object can be destroyed, kernel32.dll won't be unloaded anyhow
} }
@@ -370,17 +373,11 @@ WXHMODULE wxDynamicLibrary::MSWGetModuleHandle(const char *name, void *addr)
// flags are GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT | // flags are GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT |
// GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS // GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
HMODULE hmod; HMODULE hmod;
if ( s_pfnGetModuleHandleEx(6, (char *)addr, &hmod) && hmod ) if ( s_pfnGetModuleHandleEx(6, (LPCTSTR)addr, &hmod) && hmod )
return hmod; return hmod;
} }
// Windows CE only has Unicode API, so even we have an ANSI string here, we return ::GetModuleHandle(name);
// still need to use GetModuleHandleW() there
#ifdef __WXWINCE__
return ::GetModuleHandleW(wxConvLibc.cMB2WC(name).data());
#else
return ::GetModuleHandleA((char *)name);
#endif
} }
#endif // wxUSE_DYNLIB_CLASS #endif // wxUSE_DYNLIB_CLASS