X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/076fdb21829a408cdd14f0dbcad6888f44686c9a..01526d4f6cd7dd242e561aa24066f8ca0290a9ac:/include/wx/dynload.h diff --git a/include/wx/dynload.h b/include/wx/dynload.h index 0f69c8e709..d70c8cfa1f 100644 --- a/include/wx/dynload.h +++ b/include/wx/dynload.h @@ -13,7 +13,7 @@ #ifndef _WX_DYNAMICLOADER_H__ #define _WX_DYNAMICLOADER_H__ -#if defined(__GNUG__) && !defined(__APPLE__) +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma interface "dynload.h" #endif @@ -25,182 +25,16 @@ #if wxUSE_DYNAMIC_LOADER +#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 - class WXDLLIMPEXP_BASE wxPluginLibrary; -WX_DECLARE_EXPORTED_STRING_HASH_MAP(wxPluginLibrary *, wxDLManifest); -typedef wxDLManifest 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 -}; - -enum wxDynamicLibraryCategory -{ - wxDL_LIBRARY, // standard library - wxDL_MODULE, // loadable module/plugin -}; - -enum wxPluginCategory -{ - wxDL_PLUGIN_GUI, // plugin that uses GUI classes - wxDL_PLUGIN_BASE, // wxBase-only plugin -}; - - -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) - - 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); - - // 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; } - - // unload the library, also done automatically in dtor - - 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 - - // 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 - // to the filename): - static wxString CanonicalizePluginName(const wxString& name, - wxPluginCategory cat); - - // return plugin directory on platforms where it makes sense and empty - // string on others: - static wxString GetPluginsDirectory(); - -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 @@ -259,8 +93,8 @@ private: 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. @@ -282,17 +116,17 @@ public: // macro because it's of arguable use outside of that. #if WXWIN_COMPATIBILITY_2_2 - static wxPluginLibrary *GetObjectFromHandle(wxDllType handle); + wxDEPRECATED( static wxPluginLibrary *GetObjectFromHandle(wxDllType handle) ); #endif // Instance methods. - wxPluginManager() : m_entry(NULL) {}; + 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(); @@ -325,34 +159,6 @@ private: }; -// --------------------------------------------------------------------------- -// 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 WXDLLIMPEXP_BASE 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__