X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/685a9fa61d56606cadb99a0a34773ecfb9865fa8..e8481866872d3eec6e0ce1fa7eab856abff26c34:/src/msw/dlmsw.cpp diff --git a/src/msw/dlmsw.cpp b/src/msw/dlmsw.cpp index 0bb76d72db..00cd88b5cd 100644 --- a/src/msw/dlmsw.cpp +++ b/src/msw/dlmsw.cpp @@ -2,9 +2,8 @@ // 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 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -29,7 +28,10 @@ #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 @@ -80,15 +82,8 @@ public: 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); }; // ============================================================================ @@ -116,7 +111,7 @@ wxVersionDLL::wxVersionDLL() #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(); \ @@ -175,23 +170,30 @@ wxString wxVersionDLL::GetFileVersion(const wxString& filename) const /* 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); @@ -320,20 +322,14 @@ wxDynamicLibraryDetailsArray wxDynamicLibrary::ListLoaded() 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 @@ -342,7 +338,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 +346,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 +355,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 +366,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.t_str()); } #endif // wxUSE_DYNLIB_CLASS