| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 | 
							- /////////////////////////////////////////////////////////////////////////////
 
- // Name:         wx/dynload.h
 
- // Purpose:      Dynamic loading framework
 
- // Author:       Ron Lee, David Falkinder, Vadim Zeitlin and a cast of 1000's
 
- //               (derived in part from dynlib.cpp (c) 1998 Guilhem Lavaux)
 
- // Modified by:
 
- // Created:      03/12/01
 
- // Copyright:    (c) 2001 Ron Lee <ron@debian.org>
 
- // Licence:      wxWindows licence
 
- /////////////////////////////////////////////////////////////////////////////
 
- #ifndef _WX_DYNAMICLOADER_H__
 
- #define _WX_DYNAMICLOADER_H__
 
- // ----------------------------------------------------------------------------
 
- // headers
 
- // ----------------------------------------------------------------------------
 
- #include "wx/defs.h"
 
- #if wxUSE_DYNAMIC_LOADER
 
- #include "wx/dynlib.h"
 
- #include "wx/hashmap.h"
 
- #include "wx/module.h"
 
- class WXDLLIMPEXP_FWD_BASE wxPluginLibrary;
 
- WX_DECLARE_STRING_HASH_MAP_WITH_DECL(wxPluginLibrary *, wxDLManifest,
 
-                                      class WXDLLIMPEXP_BASE);
 
- typedef wxDLManifest wxDLImports;
 
- // ---------------------------------------------------------------------------
 
- // wxPluginLibrary
 
- // ---------------------------------------------------------------------------
 
- // NOTE: Do not attempt to use a base class pointer to this class.
 
- //       wxDL is not virtual and we deliberately hide some of it's
 
- //       methods here.
 
- //
 
- //       Unless you know exacty why you need to, you probably shouldn't
 
- //       instantiate this class directly anyway, use wxPluginManager
 
- //       instead.
 
- class WXDLLIMPEXP_BASE wxPluginLibrary : public wxDynamicLibrary
 
- {
 
- public:
 
-     static wxDLImports* ms_classes;  // Static hash of all imported classes.
 
-     wxPluginLibrary( const wxString &libname, int flags = wxDL_DEFAULT );
 
-     ~wxPluginLibrary();
 
-     wxPluginLibrary  *RefLib();
 
-     bool              UnrefLib();
 
-         // These two are called by the PluginSentinel on (PLUGGABLE) object
 
-         // creation/destruction.  There is usually no reason for the user to
 
-         // call them directly.  We have to separate this from the link count,
 
-         // since the two are not interchangeable.
 
-         // FIXME: for even better debugging PluginSentinel should register
 
-         //        the name of the class created too, then we can state
 
-         //        exactly which object was not destroyed which may be
 
-         //        difficult to find otherwise.  Also this code should
 
-         //        probably only be active in DEBUG mode, but let's just
 
-         //        get it right first.
 
-     void  RefObj() { ++m_objcount; }
 
-     void  UnrefObj()
 
-     {
 
-         wxASSERT_MSG( m_objcount > 0, wxT("Too many objects deleted??") );
 
-         --m_objcount;
 
-     }
 
-         // Override/hide some base class methods
 
-     bool  IsLoaded() const { return m_linkcount > 0; }
 
-     void  Unload() { UnrefLib(); }
 
- private:
 
-     // These pointers may be NULL but if they are not, then m_ourLast follows
 
-     // m_ourFirst in the linked list, i.e. can be found by calling GetNext() a
 
-     // sufficient number of times.
 
-     const wxClassInfo    *m_ourFirst; // first class info in this plugin
 
-     const wxClassInfo    *m_ourLast;  // ..and the last one
 
-     size_t          m_linkcount;    // Ref count of library link calls
 
-     size_t          m_objcount;     // ..and (pluggable) object instantiations.
 
-     wxModuleList    m_wxmodules;    // any wxModules that we initialised.
 
-     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.
 
-     wxDECLARE_NO_COPY_CLASS(wxPluginLibrary);
 
- };
 
- class WXDLLIMPEXP_BASE wxPluginManager
 
- {
 
- public:
 
-         // Static accessors.
 
-     static wxPluginLibrary    *LoadLibrary( const wxString &libname,
 
-                                             int flags = wxDL_DEFAULT );
 
-     static bool                UnloadLibrary(const wxString &libname);
 
-         // Instance methods.
 
-     wxPluginManager() : m_entry(NULL) {}
 
-     wxPluginManager(const wxString &libname, int flags = wxDL_DEFAULT)
 
-     {
 
-         Load(libname, flags);
 
-     }
 
-     ~wxPluginManager() { if ( IsLoaded() ) Unload(); }
 
-     bool   Load(const wxString &libname, int flags = wxDL_DEFAULT);
 
-     void   Unload();
 
-     bool   IsLoaded() const { return m_entry && m_entry->IsLoaded(); }
 
-     void  *GetSymbol(const wxString &symbol, bool *success = 0)
 
-     {
 
-         return m_entry->GetSymbol( symbol, success );
 
-     }
 
-     static void CreateManifest() { ms_manifest = new wxDLManifest(wxKEY_STRING); }
 
-     static void ClearManifest() { delete ms_manifest; ms_manifest = NULL; }
 
- private:
 
-     // return the pointer to the entry for the library with given name in
 
-     // ms_manifest or NULL if none
 
-     static wxPluginLibrary *FindByName(const wxString& name)
 
-     {
 
-         const wxDLManifest::iterator i = ms_manifest->find(name);
 
-         return i == ms_manifest->end() ? NULL : i->second;
 
-     }
 
-     static wxDLManifest* ms_manifest;  // Static hash of loaded libs.
 
-     wxPluginLibrary*     m_entry;      // Cache our entry in the manifest.
 
-     // We could allow this class to be copied if we really
 
-     // wanted to, but not without modification.
 
-     wxDECLARE_NO_COPY_CLASS(wxPluginManager);
 
- };
 
- #endif  // wxUSE_DYNAMIC_LOADER
 
- #endif  // _WX_DYNAMICLOADER_H__
 
 
  |