]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/dlmsw.cpp
merge msw/gsocket.cpp into msw/sockmsw.cpp
[wxWidgets.git] / src / msw / dlmsw.cpp
index 0e3151d5542096a083b2c394814125905fa6b619..280dab0e281bdf5976cff8e0702f20b161285ff8 100644 (file)
@@ -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 = 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<wxChar *>(_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,15 +267,26 @@ wxDynamicLibraryDetailsCreator::EnumModulesProc(PSTR name,
 // wxDynamicLibrary implementation
 // ============================================================================
 
+// ----------------------------------------------------------------------------
+// misc functions
+// ----------------------------------------------------------------------------
+
+wxDllType wxDynamicLibrary::GetProgramHandle()
+{
+    return (wxDllType)::GetModuleHandle(NULL);
+}
+
 // ----------------------------------------------------------------------------
 // loading/unloading DLLs
 // ----------------------------------------------------------------------------
 
 /* static */
 wxDllType
-wxDynamicLibrary::RawLoad(const wxString& libname, int WXUNUSED(flags))
+wxDynamicLibrary::RawLoad(const wxString& libname, int flags)
 {
-    return ::LoadLibrary(libname);
+    return flags & wxDL_GET_LOADED
+            ? ::GetModuleHandle(libname.t_str())
+            : ::LoadLibrary(libname.t_str());
 }
 
 /* static */
@@ -262,7 +298,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 +316,7 @@ wxDynamicLibraryDetailsArray wxDynamicLibrary::ListLoaded()
 {
     wxDynamicLibraryDetailsArray dlls;
 
+#if wxUSE_DBGHELP
     if ( wxDbgHelpDLL::Init() )
     {
         // prepare to use functions for version info extraction
@@ -293,6 +336,7 @@ wxDynamicLibraryDetailsArray wxDynamicLibrary::ListLoaded()
             wxLogLastError(_T("EnumerateLoadedModules"));
         }
     }
+#endif // wxUSE_DBGHELP
 
     return dlls;
 }