]> git.saurik.com Git - wxWidgets.git/commitdiff
Support Unicode module names in wxDynamicLibrary::MSWGetModuleHandle().
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 8 Apr 2013 14:15:31 +0000 (14:15 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 8 Apr 2013 14:15:31 +0000 (14:15 +0000)
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
src/msw/dlmsw.cpp

index 6a704d7eb66278822f580f88f3051020bd0ea2b4..359444c06178d9c735e75b0b3a86a8084955f83c 100644 (file)
@@ -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:
index 0bb76d72db470bdca66717ab349bf1c7ec9e09bc..b8363c605bdedc3b3783fcb5a78d260f047d6eb0 100644 (file)
@@ -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