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:
@@ -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:
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user