From 252e3b2c29ccc679a2ab45022196ac3f61a97fa2 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 8 Apr 2013 14:15:31 +0000 Subject: [PATCH] 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 --- include/wx/dynlib.h | 2 +- src/msw/dlmsw.cpp | 25 +++++++++++-------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/include/wx/dynlib.h b/include/wx/dynlib.h index 6a704d7..359444c 100644 --- a/include/wx/dynlib.h +++ b/include/wx/dynlib.h @@ -359,7 +359,7 @@ public: // 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 // 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__ protected: diff --git a/src/msw/dlmsw.cpp b/src/msw/dlmsw.cpp index 0bb76d7..b8363c6 100644 --- a/src/msw/dlmsw.cpp +++ b/src/msw/dlmsw.cpp @@ -185,13 +185,16 @@ wxDynamicLibraryDetailsCreator::EnumModulesProc(PCSTR name, wxDynamicLibraryDetails *details = new wxDynamicLibraryDetails; // fill in simple properties - details->m_name = wxString::FromAscii(name); + details->m_name = name; 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); @@ -342,7 +345,7 @@ wxDynamicLibraryDetailsArray wxDynamicLibrary::ListLoaded() } /* 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 @@ -350,7 +353,7 @@ WXHMODULE wxDynamicLibrary::MSWGetModuleHandle(const char *name, void *addr) // 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; @@ -359,7 +362,7 @@ WXHMODULE wxDynamicLibrary::MSWGetModuleHandle(const char *name, void *addr) { 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 } @@ -370,17 +373,11 @@ WXHMODULE wxDynamicLibrary::MSWGetModuleHandle(const char *name, void *addr) // 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); } #endif // wxUSE_DYNLIB_CLASS -- 2.7.4