X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/34138703c3997ce676a1e713d9ff9eb020640da7..8ffd43c56b793781fde046aa532340b92a0067eb:/include/wx/dynlib.h diff --git a/include/wx/dynlib.h b/include/wx/dynlib.h index 428048ce14..98bc1839a6 100644 --- a/include/wx/dynlib.h +++ b/include/wx/dynlib.h @@ -1,95 +1,121 @@ +///////////////////////////////////////////////////////////////////////////// +// 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 -#include -#include - -// --------------------------------------------------------------------------- -// Some more info on a class +#include -typedef struct { - wxClassInfo *class_info; - wxString path; -} wxClassLibInfo; +#if wxUSE_DYNLIB_CLASS -// --------------------------------------------------------------------------- -// Useful arrays +#include +#include +#include + +// 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 -WX_DEFINE_ARRAY(wxClassInfo *, wxArrayClassInfo); -WX_DEFINE_ARRAY(wxClassLibInfo *, wxArrayClassLibInfo); +// ---------------------------------------------------------------------------- +// wxLibrary +// ---------------------------------------------------------------------------- -// --------------------------------------------------------------------------- -// wxClassLibrary +class wxLibrary : public wxObject +{ +public: + wxHashTable classTable; -class wxClassLibrary { -protected: - wxArrayClassLibInfo m_list; public: - wxClassLibrary(void); - ~wxClassLibrary(void); + wxLibrary(wxDllType handle); + ~wxLibrary(); - // Dynamic (un)register a (new) class in the database - void RegisterClass(wxClassInfo *class_info, const wxString& path); - void UnregisterClass(wxClassInfo *class_info); + // Get a symbol from the dynamic library + void *GetSymbol(const wxString& symbname); - // Fetch all infos whose name matches the string (wildcards allowed) - bool FetchInfos(const wxString& path, wxArrayClassLibInfo& infos); + // Create the object whose classname is "name" + wxObject *CreateObject(const wxString& name); - // Create all objects whose name matches the string (wildcards allowed) - bool CreateObjects(const wxString& path, wxArrayClassInfo& objs); +protected: + void PrepareClasses(wxClassInfo *first); - // Create one object using the EXACT name - wxObject *CreateObject(const wxString& path); + wxDllType m_handle; }; -// --------------------------------------------------------------------------- -// wxLibrary +// ---------------------------------------------------------------------------- +// wxLibraries +// ---------------------------------------------------------------------------- -class wxLibrary: public wxObject { -protected: - wxClassLibrary *m_liblist; - void *m_handle; +class wxLibraries +{ public: - wxLibrary(void *handle); - ~wxLibrary(void); + wxLibraries(); + ~wxLibraries(); - // Get a symbol from the dynamic library - void *GetSymbol(const wxString& symbname); + // caller is responsible for deleting the returned pointer if !NULL + wxLibrary *LoadLibrary(const wxString& basename); - // Create the object whose classname is "name" - wxObject *CreateObject(const wxString& name); + wxObject *CreateObject(const wxString& name); - wxClassLibrary *ClassLib() const; -}; - -// --------------------------------------------------------------------------- -// wxLibraries - -class wxLibraries { protected: - wxList m_loaded; -public: - wxLibraries(void); - ~wxLibraries(void); - - wxLibrary *LoadLibrary(const wxString& name); - wxObject *CreateObject(const wxString& name); + wxList m_loaded; }; -// --------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- // Global variables +// ---------------------------------------------------------------------------- extern wxLibraries wxTheLibraries; -// --------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- // Interesting defines +// ---------------------------------------------------------------------------- -#define WXDLL_ENTRY_FUNCTION() extern "C" wxClassLibrary *GetClassList() -#define WXDLL_EXIT_FUNCTION(param) extern "C" void FreeClassList(wxClassLibrary *param) +#define WXDLL_ENTRY_FUNCTION() \ +extern "C" wxClassInfo *wxGetClassFirst(); \ +wxClassInfo *wxGetClassFirst() { \ + return wxClassInfo::GetFirst(); \ +} -#endif +#endif // wxUSE_DYNLIB_CLASS + +#endif // _WX_DYNLIB_H__