X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/da55d0644f1cc11b5c55de4fc18d039f69666e86..3e356d414488f3949baf7467bbc784f400287202:/src/msw/dlmsw.cpp?ds=inline diff --git a/src/msw/dlmsw.cpp b/src/msw/dlmsw.cpp index 0e3151d554..ac4f88b1b9 100644 --- a/src/msw/dlmsw.cpp +++ b/src/msw/dlmsw.cpp @@ -28,7 +28,7 @@ #include "wx/msw/private.h" #include "wx/msw/debughlp.h" -const wxChar *wxDynamicLibrary::ms_dllext = _T(".dll"); +const wxString wxDynamicLibrary::ms_dllext(_T(".dll")); // ---------------------------------------------------------------------------- // private classes @@ -79,8 +79,25 @@ 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; + #else + typedef DWORD DWORD_32_64; + #endif + static BOOL CALLBACK - EnumModulesProc(PSTR name, DWORD base, ULONG size, void *data); + EnumModulesProc(NameStr_t name, DWORD_32_64 base, ULONG size, void *data); }; // ---------------------------------------------------------------------------- @@ -97,7 +114,7 @@ HMODULE wxGetModuleHandle(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, LPCTSTR, HMODULE *); + typedef BOOL (WINAPI *GetModuleHandleEx_t)(DWORD, LPCSTR, HMODULE *); static const GetModuleHandleEx_t INVALID_FUNC_PTR = (GetModuleHandleEx_t)-1; @@ -121,8 +138,13 @@ HMODULE wxGetModuleHandle(const char *name, void *addr) return hmod; } - // if failed, try by name - return ::GetModuleHandleA(name); + // 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 } // ============================================================================ @@ -172,7 +194,7 @@ wxString wxVersionDLL::GetFileVersion(const wxString& filename) const wxString ver; if ( m_dll.IsLoaded() ) { - wxChar *pc = wx_const_cast(wxChar *, filename.c_str()); + wxChar *pc = wx_const_cast(wxChar *, (const wxChar*) filename.t_str()); DWORD dummy; DWORD sizeVerInfo = m_pfnGetFileVersionInfoSize(pc, &dummy); @@ -183,7 +205,10 @@ wxString wxVersionDLL::GetFileVersion(const wxString& filename) const { void *pVer; UINT sizeInfo; - if ( m_pfnVerQueryValue(buf.data(), _T("\\"), &pVer, &sizeInfo) ) + if ( m_pfnVerQueryValue(buf.data(), + const_cast(_T("\\")), + &pVer, + &sizeInfo) ) { VS_FIXEDFILEINFO *info = (VS_FIXEDFILEINFO *)pVer; ver.Printf(_T("%d.%d.%d.%d"), @@ -206,8 +231,8 @@ wxString wxVersionDLL::GetFileVersion(const wxString& filename) const /* static */ BOOL CALLBACK -wxDynamicLibraryDetailsCreator::EnumModulesProc(PSTR name, - DWORD base, +wxDynamicLibraryDetailsCreator::EnumModulesProc(NameStr_t name, + DWORD_32_64 base, ULONG size, void *data) { @@ -217,11 +242,11 @@ wxDynamicLibraryDetailsCreator::EnumModulesProc(PSTR name, // fill in simple properties details->m_name = wxString::FromAscii(name); - details->m_address = wx_reinterpret_cast(void *, base); + details->m_address = wxUIntToPtr(base); details->m_length = size; // to get the version, we first need the full path - HMODULE hmod = wxGetModuleHandle(name, (void *)base); + HMODULE hmod = wxGetModuleHandle(name, details->m_address); if ( hmod ) { wxString fullname = wxGetFullModuleName(hmod); @@ -242,6 +267,15 @@ wxDynamicLibraryDetailsCreator::EnumModulesProc(PSTR name, // wxDynamicLibrary implementation // ============================================================================ +// ---------------------------------------------------------------------------- +// misc functions +// ---------------------------------------------------------------------------- + +wxDllType wxDynamicLibrary::GetProgramHandle() +{ + return (wxDllType)::GetModuleHandle(NULL); +} + // ---------------------------------------------------------------------------- // loading/unloading DLLs // ---------------------------------------------------------------------------- @@ -250,7 +284,7 @@ wxDynamicLibraryDetailsCreator::EnumModulesProc(PSTR name, wxDllType wxDynamicLibrary::RawLoad(const wxString& libname, int WXUNUSED(flags)) { - return ::LoadLibrary(libname); + return ::LoadLibrary(libname.t_str()); } /* static */ @@ -262,7 +296,13 @@ void wxDynamicLibrary::Unload(wxDllType handle) /* static */ void *wxDynamicLibrary::RawGetSymbol(wxDllType handle, const wxString& name) { - return ::GetProcAddress(handle, name); + return (void *)::GetProcAddress(handle, +#ifdef __WXWINCE__ + name.c_str() +#else + name.ToAscii() +#endif // __WXWINCE__ + ); } // ---------------------------------------------------------------------------- @@ -274,6 +314,7 @@ wxDynamicLibraryDetailsArray wxDynamicLibrary::ListLoaded() { wxDynamicLibraryDetailsArray dlls; +#if wxUSE_DBGHELP if ( wxDbgHelpDLL::Init() ) { // prepare to use functions for version info extraction @@ -293,6 +334,7 @@ wxDynamicLibraryDetailsArray wxDynamicLibrary::ListLoaded() wxLogLastError(_T("EnumerateLoadedModules")); } } +#endif // wxUSE_DBGHELP return dlls; }