X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f4a8c29f7a3ffa7eb60d9b7f055565eb2df368d9..6ec9d18f1b2c3d370190560e4cb5ba0997a2e778:/include/wx/dynlib.h?ds=sidebyside diff --git a/include/wx/dynlib.h b/include/wx/dynlib.h index cebc563b7e..ec1b270bd3 100644 --- a/include/wx/dynlib.h +++ b/include/wx/dynlib.h @@ -1,69 +1,152 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: dynlib.cpp +// Purpose: Dynamic library management +// Author: Guilhem Lavaux +// Modified by: +// Created: 20/07/98 +// RCS-ID: $Id$ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + #ifndef _WX_DYNLIB_H__ #define _WX_DYNLIB_H__ #ifdef __GNUG__ -#pragma interface +# pragma interface #endif +#include + +#if wxUSE_DYNLIB_CLASS + #include #include -#include #include -// --------------------------------------------------------------------------- -// wxLibrary +// this is normally done by configure, but I leave it here for now... +#if defined(__UNIX__) && !(defined(HAVE_DLOPEN) || defined(HAVE_SHL_LOAD)) +# if defined(__LINUX__) || defined(__SOLARIS__) || defined(__SUNOS__) || defined(__FREEBSD__) +# define HAVE_DLOPEN +# elif defined(__HPUX__) +# define HAVE_SHL_LOAD +# endif // Unix flavour +#endif // !Unix or already have some HAVE_xxx defined + +#if defined(HAVE_DLOPEN) +# include + typedef void *wxDllType; +#elif defined(HAVE_SHL_LOAD) +# include + typedef shl_t wxDllType; +#elif defined(__WINDOWS__) +# include + typedef HMODULE wxDllType; +#elif defined(__WXMAC__) + typedef CFragConnectionID wxDllType; +#else +# error "wxLibrary can't be compiled on this platform, sorry." +#endif // OS + +// defined in windows.h +#ifdef LoadLibrary +# undef LoadLibrary +#endif -class wxLibrary: public wxObject { - protected: - void *m_handle; - bool m_destroy; +// ---------------------------------------------------------------------------- +// wxDllLoader +// ---------------------------------------------------------------------------- +/** wxDllLoader is a class providing an interface similar to unix's + dlopen(). It is used by the wxLibrary framework and manages the + actual loading of DLLs and the resolving of symbols in them. + There are no instances of this class, it simply serves as a + namespace for its static member functions. +*/ +class wxDllLoader +{ public: - wxHashTable classTable; + /** This function loads a shared library into memory, with libname + being the basename of the library, without the filename + extension. No initialisation of the library will be done. + @param libname Name of the shared object to load. + @param success Must point to a bool variable which will be set to TRUE or FALSE. + @return A handle to the loaded DLL. Use success parameter to test if it is valid. + */ + static wxDllType LoadDll(const wxString & libname, bool *success); + /** This function resolves a symbol in a loaded DLL, such as a + variable or function name. + @param dllHandle Handle of the DLL, as returned by LoadDll(). + @param name Name of the symbol. + @return A pointer to the symbol. + */ + static void * GetSymbol(wxDllType dllHandle, const wxString &name); + private: + /// forbid construction of objects + wxDllLoader() +}; - public: - wxLibrary(void *handle); - ~wxLibrary(void); +// ---------------------------------------------------------------------------- +// wxLibrary +// ---------------------------------------------------------------------------- + +class wxLibrary : public wxObject +{ +public: + wxHashTable classTable; - // Get a symbol from the dynamic library - void *GetSymbol(const wxString& symbname); +public: + wxLibrary(wxDllType handle); + ~wxLibrary(); - // Create the object whose classname is "name" - wxObject *CreateObject(const wxString& name); + // Get a symbol from the dynamic library + void *GetSymbol(const wxString& symbname); - // Merge the symbols with the main symbols: WARNING! the library will not - // be unloaded. - void MergeWithSystem(); + // Create the object whose classname is "name" + wxObject *CreateObject(const wxString& name); - protected: - void PrepareClasses(wxClassInfo **first); +protected: + void PrepareClasses(wxClassInfo *first); + + wxDllType m_handle; }; -// --------------------------------------------------------------------------- + + +// ---------------------------------------------------------------------------- // wxLibraries +// ---------------------------------------------------------------------------- -class wxLibraries { - protected: - wxList m_loaded; - public: - wxLibraries(void); - ~wxLibraries(void); +class wxLibraries +{ +public: + wxLibraries(); + ~wxLibraries(); - wxLibrary *LoadLibrary(const wxString& name); - wxObject *CreateObject(const wxString& name); + // caller is responsible for deleting the returned pointer if !NULL + wxLibrary *LoadLibrary(const wxString& basename); + + wxObject *CreateObject(const wxString& name); + +protected: + wxList m_loaded; }; -// --------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- // Global variables +// ---------------------------------------------------------------------------- extern wxLibraries wxTheLibraries; -// --------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- // Interesting defines +// ---------------------------------------------------------------------------- #define WXDLL_ENTRY_FUNCTION() \ -extern "C" wxClassInfo **wxGetClassFirst(); \ -wxClassInfo **wxGetClassFirst() { \ - return &wxClassInfo::first; \ +extern "C" wxClassInfo *wxGetClassFirst(); \ +wxClassInfo *wxGetClassFirst() { \ + return wxClassInfo::GetFirst(); \ } -#endif +#endif // wxUSE_DYNLIB_CLASS + +#endif // _WX_DYNLIB_H__