X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3d7fa4e68436ab9ecdc74e9bd68f72bdff76978d..880d76dfb12d4e8466df30d641bb25c6f71bd398:/include/wx/dynload.h diff --git a/include/wx/dynload.h b/include/wx/dynload.h index 8aaa926807..bb2997bb4f 100644 --- a/include/wx/dynload.h +++ b/include/wx/dynload.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: dynload.h +// Name: wx/dynload.h // Purpose: Dynamic loading framework // Author: Ron Lee, David Falkinder, Vadim Zeitlin and a cast of 1000's // (derived in part from dynlib.cpp (c) 1998 Guilhem Lavaux) @@ -7,16 +7,12 @@ // Created: 03/12/01 // RCS-ID: $Id$ // Copyright: (c) 2001 Ron Lee -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_DYNAMICLOADER_H__ #define _WX_DYNAMICLOADER_H__ -#ifdef __GNUG__ -#pragma interface "dynload.h" -#endif - // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- @@ -25,152 +21,16 @@ #if wxUSE_DYNAMIC_LOADER -#include "wx/hash.h" +#include "wx/dynlib.h" +#include "wx/hashmap.h" #include "wx/module.h" -// FIXME: can this go in private.h or something too?? -#if defined(__WXPM__) || defined(__EMX__) -#define INCL_DOS -#include -#endif - -#ifdef __WXMSW__ -#include "wx/msw/private.h" -#endif - -// Ugh, I'd much rather this was typesafe, but no time -// to rewrite wxHashTable right now.. - -typedef wxHashTable wxDLManifest; -typedef wxHashTable wxDLImports; - -// ---------------------------------------------------------------------------- -// conditional compilation -// ---------------------------------------------------------------------------- - - // 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__) -typedef HMODULE wxDllType; -#elif defined(HAVE_DLOPEN) -#include -typedef void *wxDllType; -#elif defined(HAVE_SHL_LOAD) -#include -typedef shl_t wxDllType; -#elif defined(__DARWIN__) -typedef void *wxDllType; -#elif defined(__WXMAC__) -typedef CFragConnectionID wxDllType; -#else -#error "Dynamic Loading classes can't be compiled on this platform, sorry." -#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. - -enum wxDLFlags -{ - wxDL_LAZY = 0x00000001, // resolve undefined symbols at first use - wxDL_NOW = 0x00000002, // resolve undefined symbols on load - wxDL_GLOBAL = 0x00000004, // export extern symbols to subsequently - // loaded libs. - wxDL_VERBATIM = 0x00000008, // Attempt to load the supplied library - // name without appending the usual dll - // filename extension. - - wxDL_NOSHARE = 0x00000010, // load new DLL, don't reuse already loaded - - // FIXME: why? (VZ) -#ifdef __osf__ - wxDL_DEFAULT = wxDL_LAZY -#else - wxDL_DEFAULT = wxDL_LAZY | wxDL_GLOBAL -#endif -}; - - -class WXDLLEXPORT 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) - - static wxDllType GetProgramHandle(); - - // return the platform standard DLL extension (with leading dot) - - static const wxChar *GetDllExt() { return ms_dllext; } - - wxDynamicLibrary() : m_handle(0) {} - wxDynamicLibrary(wxString libname, int flags = wxDL_DEFAULT) - : m_handle(0) - { - Load(libname, flags); - } - ~wxDynamicLibrary() { Unload(); } - - // return TRUE if the library was loaded successfully - - bool IsLoaded() const { return m_handle != 0; } - - // load the library with the given name - // (full or not), return TRUE on success - - bool Load(wxString libname, int flags = wxDL_DEFAULT); - - // unload the library, also done automatically in dtor +class WXDLLIMPEXP_FWD_BASE wxPluginLibrary; - void Unload(); - - // Return the raw handle from dlopen and friends. - - 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. - - void *GetSymbol(const wxString& name, bool *success = 0) const; - -#if WXWIN_COMPATIBILITY_2_2 - operator bool() const { return IsLoaded(); } -#endif - -protected: - - // Platform specific shared lib suffix. - - static const wxChar *ms_dllext; - - // the handle to DLL or NULL - - wxDllType m_handle; - - // no copy ctor/assignment operators - // or we'd try to unload the library twice - -DECLARE_NO_COPY_CLASS(wxDynamicLibrary) -}; +WX_DECLARE_STRING_HASH_MAP_WITH_DECL(wxPluginLibrary *, wxDLManifest, + class WXDLLIMPEXP_BASE); +typedef wxDLManifest wxDLImports; // --------------------------------------------------------------------------- // wxPluginLibrary @@ -184,7 +44,7 @@ DECLARE_NO_COPY_CLASS(wxDynamicLibrary) // instantiate this class directly anyway, use wxPluginManager // instead. -class WXDLLEXPORT wxPluginLibrary : public wxDynamicLibrary +class WXDLLIMPEXP_BASE wxPluginLibrary : public wxDynamicLibrary { public: @@ -211,7 +71,7 @@ public: void RefObj() { ++m_objcount; } void UnrefObj() { - wxASSERT_MSG( m_objcount > 0, _T("Too many objects deleted??") ); + wxASSERT_MSG( m_objcount > 0, wxT("Too many objects deleted??") ); --m_objcount; } @@ -222,23 +82,26 @@ public: private: - wxClassInfo *m_before; // sm_first before loading this lib - wxClassInfo *m_after; // ..and after. + // These pointers may be NULL but if they are not, then m_ourLast follows + // m_ourFirst in the linked list, i.e. can be found by calling GetNext() a + // sufficient number of times. + const wxClassInfo *m_ourFirst; // first class info in this plugin + const wxClassInfo *m_ourLast; // ..and the last one size_t m_linkcount; // Ref count of library link calls size_t m_objcount; // ..and (pluggable) object instantiations. wxModuleList m_wxmodules; // any wxModules that we initialised. - void UpdateClassInfo(); // Update the wxClassInfo table - void RestoreClassInfo(); // Restore the original wxClassInfo state. + void UpdateClasses(); // Update ms_classes + void RestoreClasses(); // Removes this library from ms_classes void RegisterModules(); // Init any wxModules in the lib. void UnregisterModules(); // Cleanup any wxModules we installed. -DECLARE_NO_COPY_CLASS(wxPluginLibrary) + wxDECLARE_NO_COPY_CLASS(wxPluginLibrary); }; -class WXDLLEXPORT wxPluginManager +class WXDLLIMPEXP_BASE wxPluginManager { public: @@ -248,21 +111,14 @@ public: int flags = wxDL_DEFAULT ); static bool UnloadLibrary(const wxString &libname); - // This is used by wxDllLoader. It's wrapped in the compatibility - // macro because it's of arguable use outside of that. - -#if WXWIN_COMPATIBILITY_2_2 - static wxPluginLibrary *GetObjectFromHandle(wxDllType handle); -#endif - // Instance methods. - wxPluginManager() : m_entry(0) {}; + wxPluginManager() : m_entry(NULL) {} wxPluginManager(const wxString &libname, int flags = wxDL_DEFAULT) { Load(libname, flags); } - ~wxPluginManager() { Unload(); } + ~wxPluginManager() { if ( IsLoaded() ) Unload(); } bool Load(const wxString &libname, int flags = wxDL_DEFAULT); void Unload(); @@ -277,45 +133,24 @@ public: static void ClearManifest() { delete ms_manifest; ms_manifest = NULL; } private: + // return the pointer to the entry for the library with given name in + // ms_manifest or NULL if none + static wxPluginLibrary *FindByName(const wxString& name) + { + const wxDLManifest::iterator i = ms_manifest->find(name); + + return i == ms_manifest->end() ? NULL : i->second; + } static wxDLManifest* ms_manifest; // Static hash of loaded libs. wxPluginLibrary* m_entry; // Cache our entry in the manifest. // We could allow this class to be copied if we really // wanted to, but not without modification. - -DECLARE_NO_COPY_CLASS(wxPluginManager) + wxDECLARE_NO_COPY_CLASS(wxPluginManager); }; -// --------------------------------------------------------------------------- -// wxDllLoader -// --------------------------------------------------------------------------- - - // Cross platform wrapper for dlopen and friends. - // There are no instances of this class, it simply - // serves as a namespace for its static member functions. - -#if WXWIN_COMPATIBILITY_2_2 -class WXDLLEXPORT wxDllLoader -{ -public: - - static wxDllType LoadLibrary(const wxString& name, bool *success = NULL); - static void UnloadLibrary(wxDllType dll); - - static wxDllType GetProgramHandle() { return wxDynamicLibrary::GetProgramHandle(); } - - static void *GetSymbol(wxDllType dllHandle, const wxString &name, bool *success = 0); - - static wxString GetDllExt() { return wxDynamicLibrary::GetDllExt(); } - -private: - - wxDllLoader(); // forbid construction of objects -}; -#endif - #endif // wxUSE_DYNAMIC_LOADER #endif // _WX_DYNAMICLOADER_H__