]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/dlmsw.cpp
Add code showing stereo support to the OpenGL cube sample.
[wxWidgets.git] / src / msw / dlmsw.cpp
index e3bde950a5d323a28e894226637868dd70df1a99..00cd88b5cddd9c615c83c82294c79c02f37df8a5 100644 (file)
@@ -1,10 +1,9 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        msw/dlmsw.cpp
+// 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 <vadim@wxwindows.org>
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #include "wx/msw/private.h"
 #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
@@ -79,25 +82,8 @@ 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(NameStr_t name, DWORD_32_64 base, ULONG size, void *data);
+    EnumModulesProc(PCTSTR name, DWORD64 base, ULONG size, PVOID data);
 };
 
 // ============================================================================
@@ -125,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();                                                   \
@@ -184,23 +170,30 @@ wxString wxVersionDLL::GetFileVersion(const wxString& filename) const
 
 /* static */
 BOOL CALLBACK
-wxDynamicLibraryDetailsCreator::EnumModulesProc(NameStr_t 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);
@@ -234,13 +227,62 @@ wxDllType wxDynamicLibrary::GetProgramHandle()
 // loading/unloading DLLs
 // ----------------------------------------------------------------------------
 
+#ifndef MAX_PATH
+    #define MAX_PATH 260        // from VC++ headers
+#endif
+
 /* static */
 wxDllType
 wxDynamicLibrary::RawLoad(const wxString& libname, int flags)
 {
-    return flags & wxDL_GET_LOADED
-            ? ::GetModuleHandle(libname.t_str())
-            : ::LoadLibrary(libname.t_str());
+    if (flags & wxDL_GET_LOADED)
+        return ::GetModuleHandle(libname.t_str());
+
+    // Explicitly look in the same path as where the main wx HINSTANCE module
+    // is located (usually the executable or the DLL that uses wx).  Normally
+    // this is automatically part of the default search path but in some cases
+    // it may not be, such as when the wxPython extension modules need to load
+    // a DLL, but the intperpreter executable is located elsewhere.  Doing
+    // this allows us to always be able to dynamically load a DLL that is
+    // located at the same place as the wx modules.
+    wxString modpath, path;
+    ::GetModuleFileName(wxGetInstance(),
+                        wxStringBuffer(modpath, MAX_PATH+1),
+                        MAX_PATH);
+    
+    wxFileName::SplitPath(modpath, &path, NULL, NULL);
+
+    typedef BOOL (WINAPI *SetDllDirectory_t)(LPCTSTR lpPathName);
+
+    static SetDllDirectory_t s_pfnSetDllDirectory = (SetDllDirectory_t) -1;
+
+    if ( s_pfnSetDllDirectory == (SetDllDirectory_t) -1 )
+    {
+        /*
+        Should wxLoadedDLL ever not be used here (or rather, the
+        wxDL_GET_LOADED flag isn't used), infinite recursion will take
+        place (unless s_pfnSetDllDirectory is set to NULL here right
+        before loading the DLL).
+        */
+        wxLoadedDLL dllKernel("kernel32.dll");
+
+        wxDL_INIT_FUNC_AW(s_pfn, SetDllDirectory, dllKernel);
+    }
+
+    if (s_pfnSetDllDirectory)
+    {
+        s_pfnSetDllDirectory(path.t_str());
+    }
+
+    wxDllType handle = ::LoadLibrary(libname.t_str());
+
+    // reset the search path
+    if (s_pfnSetDllDirectory)
+    {
+        s_pfnSetDllDirectory(NULL);
+    }
+
+    return handle;
 }
 
 /* static */
@@ -280,14 +322,14 @@ wxDynamicLibraryDetailsArray wxDynamicLibrary::ListLoaded()
         params.dlls = &dlls;
         params.verDLL = &verDLL;
 
-        if ( !wxDbgHelpDLL::EnumerateLoadedModules
+        if ( !wxDbgHelpDLL::EnumerateLoadedModulesT
                             (
                                 ::GetCurrentProcess(),
                                 wxDynamicLibraryDetailsCreator::EnumModulesProc,
                                 &params
                             ) )
         {
-            wxLogLastError(wxT("EnumerateLoadedModules"));
+            wxLogLastError(wxT("EnumerateLoadedModulesT"));
         }
     }
 #endif // wxUSE_DBGHELP
@@ -296,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
@@ -304,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;
 
@@ -313,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
     }
@@ -324,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