X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/371a5b4e62eb415107e045588f614fa49e866e78..b3fcfa4d89d44425ed28050462c6064100fe7b05:/include/wx/dynload.h diff --git a/include/wx/dynload.h b/include/wx/dynload.h index 145ec568a5..8f119b49bb 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,157 +25,17 @@ #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; -class WXDLLEXPORT wxPluginLibrary; -WX_DECLARE_EXPORTED_STRING_HASH_MAP(wxPluginLibrary *, wxDLManifest); +WX_DECLARE_STRING_HASH_MAP_WITH_DECL(wxPluginLibrary *, wxDLManifest, + class WXDLLIMPEXP_BASE); 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 -}; - - -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); - - // 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 - -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) -}; - - // --------------------------------------------------------------------------- // wxPluginLibrary // --------------------------------------------------------------------------- @@ -188,7 +48,7 @@ protected: // instantiate this class directly anyway, use wxPluginManager // instead. -class WXDLLEXPORT wxPluginLibrary : public wxDynamicLibrary +class WXDLLIMPEXP_BASE wxPluginLibrary : public wxDynamicLibrary { public: @@ -233,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. @@ -242,7 +102,7 @@ private: }; -class WXDLLEXPORT wxPluginManager +class WXDLLIMPEXP_BASE wxPluginManager { public: @@ -299,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 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__