X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a83f860948059b0273b5cc6d9e43fadad3ebfca..b404a8f3b072129c107c6d9a5e0f6f53cd34807b:/src/msw/dlmsw.cpp diff --git a/src/msw/dlmsw.cpp b/src/msw/dlmsw.cpp index 25700c5cdb..cdff7387ab 100644 --- a/src/msw/dlmsw.cpp +++ b/src/msw/dlmsw.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/dlmsw.cpp +// Name: src/msw/dlmsw.cpp // Purpose: Win32-specific part of wxDynamicLibrary and related classes // Author: Vadim Zeitlin // Modified by: @@ -79,16 +79,6 @@ public: wxVersionDLL *verDLL; }; - // the declared type of the first EnumModulesProc() parameter changed in - // recent SDK versions and is no PCSTR instead of old PSTR, we know that - // it's const in version 11 and non-const in version 8 included with VC8 - // (and earlier), suppose that it's only changed in version 11 - #if defined(API_VERSION_NUMBER) && API_VERSION_NUMBER >= 11 - typedef PCSTR NameStr_t; - #else - typedef PSTR NameStr_t; - #endif - // TODO: fix EnumerateLoadedModules() to use EnumerateLoadedModules64() #ifdef __WIN64__ typedef DWORD64 DWORD_32_64; @@ -97,56 +87,9 @@ public: #endif static BOOL CALLBACK - EnumModulesProc(NameStr_t name, DWORD_32_64 base, ULONG size, void *data); + EnumModulesProc(PCSTR name, DWORD_32_64 base, ULONG size, void *data); }; -// ---------------------------------------------------------------------------- -// private functions -// ---------------------------------------------------------------------------- - -// return the module handle for the given base name -static -HMODULE wxGetModuleHandle(const char *name, void *addr) -{ - // we want to use GetModuleHandleEx() instead of usual GetModuleHandle() - // because the former works correctly for comctl32.dll while the latter - // returns NULL when comctl32.dll version 6 is used under XP (note that - // GetModuleHandleEx() is only available under XP and later, coincidence?) - - // check if we can use GetModuleHandleEx - typedef BOOL (WINAPI *GetModuleHandleEx_t)(DWORD, LPCSTR, HMODULE *); - - static const GetModuleHandleEx_t INVALID_FUNC_PTR = (GetModuleHandleEx_t)-1; - - static GetModuleHandleEx_t s_pfnGetModuleHandleEx = INVALID_FUNC_PTR; - if ( s_pfnGetModuleHandleEx == INVALID_FUNC_PTR ) - { - wxDynamicLibrary dll(wxT("kernel32.dll"), wxDL_VERBATIM); - s_pfnGetModuleHandleEx = - (GetModuleHandleEx_t)dll.RawGetSymbol(wxT("GetModuleHandleExA")); - - // dll object can be destroyed, kernel32.dll won't be unloaded anyhow - } - - // get module handle from its address - if ( s_pfnGetModuleHandleEx ) - { - // 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 ) - 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 -} - // ============================================================================ // wxVersionDLL implementation // ============================================================================ @@ -231,7 +174,7 @@ wxString wxVersionDLL::GetFileVersion(const wxString& filename) const /* static */ BOOL CALLBACK -wxDynamicLibraryDetailsCreator::EnumModulesProc(NameStr_t name, +wxDynamicLibraryDetailsCreator::EnumModulesProc(PCSTR name, DWORD_32_64 base, ULONG size, void *data) @@ -246,7 +189,8 @@ wxDynamicLibraryDetailsCreator::EnumModulesProc(NameStr_t name, details->m_length = size; // to get the version, we first need the full path - HMODULE hmod = wxGetModuleHandle(name, details->m_address); + const HMODULE + hmod = wxDynamicLibrary::MSWGetModuleHandle(name, details->m_address); if ( hmod ) { wxString fullname = wxGetFullModuleName(hmod); @@ -326,9 +270,15 @@ 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 ( ::GetCurrentProcess(), + (PENUMLOADED_MODULES_CALLBACK) wxDynamicLibraryDetailsCreator::EnumModulesProc, ¶ms ) ) @@ -341,5 +291,47 @@ wxDynamicLibraryDetailsArray wxDynamicLibrary::ListLoaded() return dlls; } +/* static */ +WXHMODULE wxDynamicLibrary::MSWGetModuleHandle(const char *name, void *addr) +{ + // we want to use GetModuleHandleEx() instead of usual GetModuleHandle() + // because the former works correctly for comctl32.dll while the latter + // returns NULL when comctl32.dll version 6 is used under XP (note that + // GetModuleHandleEx() is only available under XP and later, coincidence?) + + // check if we can use GetModuleHandleEx + typedef BOOL (WINAPI *GetModuleHandleEx_t)(DWORD, LPCSTR, HMODULE *); + + static const GetModuleHandleEx_t INVALID_FUNC_PTR = (GetModuleHandleEx_t)-1; + + static GetModuleHandleEx_t s_pfnGetModuleHandleEx = INVALID_FUNC_PTR; + if ( s_pfnGetModuleHandleEx == INVALID_FUNC_PTR ) + { + wxDynamicLibrary dll(wxT("kernel32.dll"), wxDL_VERBATIM); + s_pfnGetModuleHandleEx = + (GetModuleHandleEx_t)dll.RawGetSymbol(wxT("GetModuleHandleExA")); + + // dll object can be destroyed, kernel32.dll won't be unloaded anyhow + } + + // get module handle from its address + if ( s_pfnGetModuleHandleEx ) + { + // 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 ) + 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 +} + #endif // wxUSE_DYNLIB_CLASS