X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/181b406894cd3ed082a1beb015811fbd12e8d371..8366ae934aab9f835747b0c2e456231e8795fe78:/include/wx/dynlib.h?ds=sidebyside diff --git a/include/wx/dynlib.h b/include/wx/dynlib.h index 6e84eda08b..a08ed217a8 100644 --- a/include/wx/dynlib.h +++ b/include/wx/dynlib.h @@ -1,11 +1,11 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: dynlib.cpp -// Purpose: Dynamic library management -// Author: Guilhem Lavaux +// Name: wx/dynlib.h +// Purpose: Dynamic library loading classes +// Author: Guilhem Lavaux, Vadim Zeitlin, Vaclav Slavik // Modified by: // Created: 20/07/98 // RCS-ID: $Id$ -// Copyright: (c) Guilhem Lavaux +// Copyright: (c) 1998 Guilhem Lavaux // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// @@ -48,7 +48,7 @@ #elif defined(__WINDOWS__) # include // needed to get HMODULE typedef HMODULE wxDllType; -#elif defined(__APPLE__) && defined(__UNIX__) +#elif defined(__DARWIN__) typedef void *wxDllType; #elif defined(__WXMAC__) typedef CFragConnectionID wxDllType; @@ -63,36 +63,51 @@ #endif // ---------------------------------------------------------------------------- -// wxDllLoader +// wxDllLoader: low level DLL functions, use wxDynamicLibrary in your code // ---------------------------------------------------------------------------- -/** 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. +/* + wxDllLoader is a class providing an interface similar to unix's dlopen(). + It is used by wxDynamicLibrary wxLibrary 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 WXDLLEXPORT wxDllLoader { public: - /** 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. + /* + This function loads the shared library libname into memory. + + libname may be either the full path to the file or just the filename in + 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 + */ + static wxDllType LoadLibrary(const wxString& libname, bool *success = NULL); + + /* + This function unloads the shared library previously loaded with + LoadLibrary */ - static wxDllType LoadLibrary(const wxString & libname, bool *success = NULL); - /** This function unloads the shared library. */ static void UnloadLibrary(wxDllType dll); - /** This function returns a valid handle for the main program - itself. */ - static wxDllType GetProgramHandle(void); - /** 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. + + /* + This function returns 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(); + + /* + This function resolves a symbol in a loaded DLL, such as a + variable or function name. + + dllHandle Handle of the DLL, as returned by LoadDll(). + name Name of the symbol. + + Returns the pointer to the symbol or NULL on error. */ static void * GetSymbol(wxDllType dllHandle, const wxString &name); @@ -100,7 +115,7 @@ public: static wxString GetDllExt(); private: - /// forbid construction of objects + // forbid construction of objects wxDllLoader(); }; @@ -108,14 +123,19 @@ private: // wxDynamicLibrary - friendly interface to wxDllLoader // ---------------------------------------------------------------------------- -class wxDynamicLibrary +class WXDLLEXPORT wxDynamicLibrary { public: + // ctors wxDynamicLibrary() { m_library = 0; } wxDynamicLibrary(const wxString& name) { Load(name); } + // return TRUE if the library was loaded successfully bool IsLoaded() const { return m_library != 0; } + operator bool() const { return IsLoaded(); } + // load the library with the given name (full or not), return TRUE on + // success bool Load(const wxString& name) { m_library = wxDllLoader::LoadLibrary(name); @@ -123,12 +143,15 @@ public: return IsLoaded(); } + // unload the library, also done automatically in dtor void Unload() { if ( IsLoaded() ) - wxDllLoader::UnloadLibrary(m_library) + wxDllLoader::UnloadLibrary(m_library); } + // load a symbol from the library, return NULL if an error occured or + // symbol wasn't found void *GetSymbol(const wxString& name) const { wxCHECK_MSG( IsLoaded(), NULL, @@ -137,12 +160,19 @@ public: return wxDllLoader::GetSymbol(m_library, name); } + // unload the library + // + // NB: dtor is not virtual, don't derive from this class ~wxDynamicLibrary() { Unload(); } private: + // the handle to DLL or NULL wxDllType m_library; -}; + // no copy ctor/assignment operators (or we'd try to unload the library + // twice) + DECLARE_NO_COPY_CLASS(wxDynamicLibrary) +}; // ---------------------------------------------------------------------------- // wxLibrary @@ -150,12 +180,9 @@ private: class WXDLLEXPORT wxLibrary : public wxObject { -public: - wxHashTable classTable; - public: wxLibrary(wxDllType handle); - ~wxLibrary(); + virtual ~wxLibrary(); // Get a symbol from the dynamic library void *GetSymbol(const wxString& symbname); @@ -167,9 +194,10 @@ protected: void PrepareClasses(wxClassInfo *first); wxDllType m_handle; -}; - +public: + wxHashTable classTable; +}; // ---------------------------------------------------------------------------- // wxLibraries