]> git.saurik.com Git - wxWidgets.git/blob - include/wx/dynlib.h
Work on streams of all sorts. More to come.
[wxWidgets.git] / include / wx / dynlib.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: dynlib.cpp
3 // Purpose: Dynamic library management
4 // Author: Guilhem Lavaux
5 // Modified by:
6 // Created: 20/07/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Guilhem Lavaux
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifndef _WX_DYNLIB_H__
13 #define _WX_DYNLIB_H__
14
15 #ifdef __GNUG__
16 # pragma interface
17 #endif
18
19 #include <wx/setup.h>
20
21 #if wxUSE_DYNLIB_CLASS
22
23 #include <wx/string.h>
24 #include <wx/list.h>
25 #include <wx/hash.h>
26
27 // this is normally done by configure, but I leave it here for now...
28 #if defined(__UNIX__) && !(defined(HAVE_DLOPEN) || defined(HAVE_SHL_LOAD))
29 # if defined(__LINUX__) || defined(__SOLARIS__) || defined(__SUNOS__) || defined(__FREEBSD__)
30 # define HAVE_DLOPEN
31 # elif defined(__HPUX__)
32 # define HAVE_SHL_LOAD
33 # endif // Unix flavour
34 #endif // !Unix or already have some HAVE_xxx defined
35
36 #if defined(HAVE_DLOPEN)
37 # include <dlfcn.h>
38 typedef void *wxDllType;
39 #elif defined(HAVE_SHL_LOAD)
40 # include <dl.h>
41 typedef shl_t wxDllType;
42 #elif defined(__WINDOWS__)
43 # include <windows.h>
44 typedef HMODULE wxDllType;
45 #elif defined(__WXMAC__)
46 typedef CFragConnectionID wxDllType;
47 #else
48 # error "wxLibrary can't be compiled on this platform, sorry."
49 #endif // OS
50
51 // defined in windows.h
52 #ifdef LoadLibrary
53 # undef LoadLibrary
54 #endif
55
56 // ----------------------------------------------------------------------------
57 // wxDllLoader
58 // ----------------------------------------------------------------------------
59 /** wxDllLoader is a class providing an interface similar to unix's
60 dlopen(). It is used by the wxLibrary framework and manages the
61 actual loading of DLLs and the resolving of symbols in them.
62 There are no instances of this class, it simply serves as a
63 namespace for its static member functions.
64 */
65 class wxDllLoader
66 {
67 public:
68 /** This function loads a shared library into memory, with libname
69 being the basename of the library, without the filename
70 extension. No initialisation of the library will be done.
71 @param libname Name of the shared object to load.
72 @param success Must point to a bool variable which will be set to TRUE or FALSE.
73 @return A handle to the loaded DLL. Use success parameter to test if it is valid.
74 */
75 static wxDllType LoadLibrary(const wxString & libname, bool *success);
76 /** This function resolves a symbol in a loaded DLL, such as a
77 variable or function name.
78 @param dllHandle Handle of the DLL, as returned by LoadDll().
79 @param name Name of the symbol.
80 @return A pointer to the symbol.
81 */
82 static void * GetSymbol(wxDllType dllHandle, const wxString &name);
83 private:
84 /// forbid construction of objects
85 wxDllLoader();
86 };
87
88 // ----------------------------------------------------------------------------
89 // wxLibrary
90 // ----------------------------------------------------------------------------
91
92 class wxLibrary : public wxObject
93 {
94 public:
95 wxHashTable classTable;
96
97 public:
98 wxLibrary(wxDllType handle);
99 ~wxLibrary();
100
101 // Get a symbol from the dynamic library
102 void *GetSymbol(const wxString& symbname);
103
104 // Create the object whose classname is "name"
105 wxObject *CreateObject(const wxString& name);
106
107 protected:
108 void PrepareClasses(wxClassInfo *first);
109
110 wxDllType m_handle;
111 };
112
113
114
115 // ----------------------------------------------------------------------------
116 // wxLibraries
117 // ----------------------------------------------------------------------------
118
119 class wxLibraries
120 {
121 public:
122 wxLibraries();
123 ~wxLibraries();
124
125 // caller is responsible for deleting the returned pointer if !NULL
126 wxLibrary *LoadLibrary(const wxString& basename);
127
128 wxObject *CreateObject(const wxString& name);
129
130 protected:
131 wxList m_loaded;
132 };
133
134 // ----------------------------------------------------------------------------
135 // Global variables
136 // ----------------------------------------------------------------------------
137
138 extern wxLibraries wxTheLibraries;
139
140 // ----------------------------------------------------------------------------
141 // Interesting defines
142 // ----------------------------------------------------------------------------
143
144 #define WXDLL_ENTRY_FUNCTION() \
145 extern "C" wxClassInfo *wxGetClassFirst(); \
146 wxClassInfo *wxGetClassFirst() { \
147 return wxClassInfo::GetFirst(); \
148 }
149
150 #endif // wxUSE_DYNLIB_CLASS
151
152 #endif // _WX_DYNLIB_H__