]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/dynlib.h
BC++ 5.5 and later supports wxUSE_ON_FATAL_EXCEPTION
[wxWidgets.git] / include / wx / dynlib.h
index 49b54d71dbbad3155cd2077c30924bc0c7b82fcd..03da571c63f32de2aab7c0920935eae569044341 100644 (file)
@@ -12,7 +12,7 @@
 #ifndef _WX_DYNLIB_H__
 #define _WX_DYNLIB_H__
 
 #ifndef _WX_DYNLIB_H__
 #define _WX_DYNLIB_H__
 
-#if defined(__GNUG__) && !defined(__APPLE__)
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
 #   pragma interface "dynlib.h"
 #endif
 
 #   pragma interface "dynlib.h"
 #endif
 
 // conditional compilation
 // ----------------------------------------------------------------------------
 
 // conditional compilation
 // ----------------------------------------------------------------------------
 
-    // Note: WXPM/EMX has to be tested first, since we want to use
-    // native version, even if configure detected presence of DLOPEN.
-
+// Note: WXPM/EMX has to be tested first, since we want to use
+// native version, even if configure detected presence of DLOPEN.
 #if defined(__WXPM__) || defined(__EMX__) || defined(__WINDOWS__)
 #if defined(__WXPM__) || defined(__EMX__) || defined(__WINDOWS__)
-typedef HMODULE             wxDllType;
+    typedef HMODULE             wxDllType;
 #elif defined(HAVE_DLOPEN)
 #elif defined(HAVE_DLOPEN)
-#include <dlfcn.h>
-typedef void               *wxDllType;
+    #include <dlfcn.h>
+    typedef void               *wxDllType;
 #elif defined(HAVE_SHL_LOAD)
 #elif defined(HAVE_SHL_LOAD)
-#include <dl.h>
-typedef shl_t               wxDllType;
+    #include <dl.h>
+    typedef shl_t               wxDllType;
 #elif defined(__DARWIN__)
 #elif defined(__DARWIN__)
-typedef void               *wxDllType;
+    typedef void               *wxDllType;
 #elif defined(__WXMAC__)
 #elif defined(__WXMAC__)
-typedef CFragConnectionID   wxDllType;
+    #include <CodeFragments.h>
+    typedef CFragConnectionID   wxDllType;
 #else
 #else
-#error "Dynamic Loading classes can't be compiled on this platform, sorry."
+    #error "Dynamic Loading classes can't be compiled on this platform, sorry."
 #endif
 
 #endif
 
-
-// ---------------------------------------------------------------------------
-// wxDynamicLibrary
-// ---------------------------------------------------------------------------
-
-//FIXME:  This class isn't really common at all, it should be moved
-//        into platform dependent files.
-
-// NOTE: this class is (deliberately) not virtual, do not attempt
-//       to use it polymorphically.
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
 
 enum wxDLFlags
 {
 
 enum wxDLFlags
 {
@@ -89,103 +82,118 @@ enum wxDLFlags
 enum wxDynamicLibraryCategory
 {
     wxDL_LIBRARY,       // standard library
 enum wxDynamicLibraryCategory
 {
     wxDL_LIBRARY,       // standard library
-    wxDL_MODULE,        // loadable module/plugin
+    wxDL_MODULE         // loadable module/plugin
 };
 
 enum wxPluginCategory
 {
     wxDL_PLUGIN_GUI,    // plugin that uses GUI classes
 };
 
 enum wxPluginCategory
 {
     wxDL_PLUGIN_GUI,    // plugin that uses GUI classes
-    wxDL_PLUGIN_BASE,   // wxBase-only plugin
+    wxDL_PLUGIN_BASE    // wxBase-only plugin
 };
 
 };
 
+// ----------------------------------------------------------------------------
+// macros
+// ----------------------------------------------------------------------------
+
+// when loading a function from a DLL you always have to cast the returned
+// "void *" pointer to the correct type and, even more annoyingly, you have to
+// repeat this type twice if you want to declare and define a function pointer
+// all in one line
+//
+// this macro makes this slightly less painful by allowing you to specify the
+// type only once, as the first parameter, and creating a variable of this type
+// called "pfn<name>" initialized with the "name" from the "dynlib"
+#define wxDYNLIB_FUNCTION(type, name, dynlib) \
+    type pfn ## name = (type)(dynlib).GetSymbol(_T(#name))
+
+// ---------------------------------------------------------------------------
+// wxDynamicLibrary
+// ---------------------------------------------------------------------------
 
 class WXDLLIMPEXP_BASE wxDynamicLibrary
 {
 public:
 
 class WXDLLIMPEXP_BASE wxDynamicLibrary
 {
 public:
-        // return a valid handle for the main program itself or NULL if
-        // back linking is not supported by the current platform (e.g. Win32)
-
+    // return a valid handle for the main program itself or NULL if back
+    // linking is not supported by the current platform (e.g. Win32)
     static wxDllType         GetProgramHandle();
 
     static wxDllType         GetProgramHandle();
 
-        // return the platform standard DLL extension (with leading dot)
-
+    // return the platform standard DLL extension (with leading dot)
     static const wxChar *GetDllExt() { return ms_dllext; }
 
     static const wxChar *GetDllExt() { return ms_dllext; }
 
-    wxDynamicLibrary() : m_handle(0) {}
+    wxDynamicLibrary() : m_handle(0) { }
     wxDynamicLibrary(const wxString& libname, int flags = wxDL_DEFAULT)
         : m_handle(0)
     {
         Load(libname, flags);
     }
     wxDynamicLibrary(const wxString& libname, int flags = wxDL_DEFAULT)
         : m_handle(0)
     {
         Load(libname, flags);
     }
-    ~wxDynamicLibrary() { Unload(); }
 
 
-        // return TRUE if the library was loaded successfully
+    // NOTE: this class is (deliberately) not virtual, do not attempt
+    //       to use it polymorphically.
+    ~wxDynamicLibrary() { Unload(); }
 
 
+    // return true if the library was loaded successfully
     bool IsLoaded() const { return m_handle != 0; }
 
     bool IsLoaded() const { return m_handle != 0; }
 
-        // load the library with the given name
-        // (full or not), return TRUE on success
-
+    // load the library with the given name (full or not), return true if ok
     bool Load(wxString libname, int flags = wxDL_DEFAULT);
 
     bool Load(wxString libname, int flags = wxDL_DEFAULT);
 
-        // detach the library object from its handle, i.e. prevent the object
-        // from unloading the library in its dtor -- the caller is now
-        // responsible for doing this
+    // detach the library object from its handle, i.e. prevent the object from
+    // unloading the library in its dtor -- the caller is now responsible for
+    // doing this
     wxDllType Detach() { wxDllType h = m_handle; m_handle = 0; return h; }
 
     wxDllType Detach() { wxDllType h = m_handle; m_handle = 0; return h; }
 
-        // unload the library, also done automatically in dtor
-
-    void Unload();
+    // unload the given library handle (presumably returned by Detach() before)
+    static void Unload(wxDllType handle);
 
 
-        // Return the raw handle from dlopen and friends.
+    // unload the library, also done automatically in dtor
+    void Unload() { if ( IsLoaded() ) { Unload(m_handle); m_handle = 0; } }
 
 
+    // Return the raw handle from dlopen and friends.
     wxDllType GetLibHandle() const { return m_handle; }
 
     wxDllType GetLibHandle() const { return m_handle; }
 
-        // resolve a symbol in a loaded DLL, such as a variable or function
-        // name.  'name' is the (possibly mangled) name of the symbol.
-        // (use extern "C" to export unmangled names)
-        //
-        // Since it is perfectly valid for the returned symbol to actually be
-        // NULL, that is not always indication of an error.  Pass and test the
-        // parameter 'success' for a true indication of success or failure to
-        // load the symbol.
-        //
-        // Returns a pointer to the symbol on success, or NULL if an error
-        // occurred or the symbol wasn't found.
-
+    // resolve a symbol in a loaded DLL, such as a variable or function name.
+    // 'name' is the (possibly mangled) name of the symbol. (use extern "C" to
+    // export unmangled names)
+    //
+    // Since it is perfectly valid for the returned symbol to actually be NULL,
+    // that is not always indication of an error.  Pass and test the parameter
+    // 'success' for a true indication of success or failure to load the
+    // symbol.
+    //
+    // Returns a pointer to the symbol on success, or NULL if an error occurred
+    // or the symbol wasn't found.
     void *GetSymbol(const wxString& name, bool *success = 0) const;
 
     void *GetSymbol(const wxString& name, bool *success = 0) const;
 
-#if WXWIN_COMPATIBILITY_2_2
-    operator bool() const { return IsLoaded(); }
-#endif
 
     // return platform-specific name of dynamic library with proper extension
     // and prefix (e.g. "foo.dll" on Windows or "libfoo.so" on Linux)
     static wxString CanonicalizeName(const wxString& name,
                                      wxDynamicLibraryCategory cat = wxDL_LIBRARY);
 
 
     // return platform-specific name of dynamic library with proper extension
     // and prefix (e.g. "foo.dll" on Windows or "libfoo.so" on Linux)
     static wxString CanonicalizeName(const wxString& name,
                                      wxDynamicLibraryCategory cat = wxDL_LIBRARY);
 
-    // return name of wxWindows plugin (adds compiler and version info
+    // return name of wxWidgets plugin (adds compiler and version info
     // to the filename):
     // to the filename):
-    static wxString CanonicalizePluginName(const wxString& name,
-                                           wxPluginCategory cat);
+    static wxString
+    CanonicalizePluginName(const wxString& name,
+                           wxPluginCategory cat = wxDL_PLUGIN_GUI);
 
     // return plugin directory on platforms where it makes sense and empty
     // string on others:
     static wxString GetPluginsDirectory();
 
 
     // return plugin directory on platforms where it makes sense and empty
     // string on others:
     static wxString GetPluginsDirectory();
 
-protected:
 
 
-        // Platform specific shared lib suffix.
+#if WXWIN_COMPATIBILITY_2_2
+    operator bool() const { return IsLoaded(); }
+#endif
 
 
+protected:
+    // platform specific shared lib suffix.
     static const wxChar *ms_dllext;
 
     static const wxChar *ms_dllext;
 
-        // the handle to DLL or NULL
-
+    // the handle to DLL or NULL
     wxDllType m_handle;
 
     wxDllType m_handle;
 
-        // no copy ctor/assignment operators
-        // or we'd try to unload the library twice
-
+    // no copy ctor/assignment operators (or we'd try to unload the library
+    // twice)
     DECLARE_NO_COPY_CLASS(wxDynamicLibrary)
 };
 
     DECLARE_NO_COPY_CLASS(wxDynamicLibrary)
 };
 
@@ -212,11 +220,11 @@ public:
       which case the library is searched for in all standard locations
       (use GetDllExt() to construct the filename)
 
       which case the library is searched for in all standard locations
       (use GetDllExt() to construct the filename)
 
-      if success pointer is not NULL, it will be filled with TRUE if everything
-      went ok and FALSE otherwise
+      if success pointer is not NULL, it will be filled with true if everything
+      went ok and false otherwise
      */
     static wxDllType LoadLibrary(const wxString& name, bool *success = NULL);
      */
     static wxDllType LoadLibrary(const wxString& name, bool *success = NULL);
-    
+
     /*
       This function unloads the shared library previously loaded with
       LoadLibrary
     /*
       This function unloads the shared library previously loaded with
       LoadLibrary