Added code to look up main program symbols - unix only. PLEASE FIX FOR MSW.
[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 // This breaks app.cpp if RICHEDIT is included.
53 #if 0
54 #ifdef LoadLibrary
55 # undef LoadLibrary
56 #endif
57 #endif
58
59 // ----------------------------------------------------------------------------
60 // wxDllLoader
61 // ----------------------------------------------------------------------------
62 /** wxDllLoader is a class providing an interface similar to unix's
63 dlopen(). It is used by the wxLibrary framework and manages the
64 actual loading of DLLs and the resolving of symbols in them.
65 There are no instances of this class, it simply serves as a
66 namespace for its static member functions.
67 */
68 class wxDllLoader
69 {
70 public:
71 /** This function loads a shared library into memory, with libname
72 being the basename of the library, without the filename
73 extension. No initialisation of the library will be done.
74 @param libname Name of the shared object to load.
75 @param success Must point to a bool variable which will be set to TRUE or FALSE.
76 @return A handle to the loaded DLL. Use success parameter to test if it is valid.
77 */
78 static wxDllType LoadLibrary(const wxString & libname, bool *success);
79 /** This function returns a valid handle for the main program
80 itself. */
81 static wxDllType GetProgramHandle(void);
82 /** This function resolves a symbol in a loaded DLL, such as a
83 variable or function name.
84 @param dllHandle Handle of the DLL, as returned by LoadDll().
85 @param name Name of the symbol.
86 @return A pointer to the symbol.
87 */
88 static void * GetSymbol(wxDllType dllHandle, const wxString &name);
89 private:
90 /// forbid construction of objects
91 wxDllLoader();
92 };
93
94 // ----------------------------------------------------------------------------
95 // wxLibrary
96 // ----------------------------------------------------------------------------
97
98 class wxLibrary : public wxObject
99 {
100 public:
101 wxHashTable classTable;
102
103 public:
104 wxLibrary(wxDllType handle);
105 ~wxLibrary();
106
107 // Get a symbol from the dynamic library
108 void *GetSymbol(const wxString& symbname);
109
110 // Create the object whose classname is "name"
111 wxObject *CreateObject(const wxString& name);
112
113 protected:
114 void PrepareClasses(wxClassInfo *first);
115
116 wxDllType m_handle;
117 };
118
119
120
121 // ----------------------------------------------------------------------------
122 // wxLibraries
123 // ----------------------------------------------------------------------------
124
125 class wxLibraries
126 {
127 public:
128 wxLibraries();
129 ~wxLibraries();
130
131 // caller is responsible for deleting the returned pointer if !NULL
132 wxLibrary *LoadLibrary(const wxString& basename);
133
134 wxObject *CreateObject(const wxString& name);
135
136 protected:
137 wxList m_loaded;
138 };
139
140 // ----------------------------------------------------------------------------
141 // Global variables
142 // ----------------------------------------------------------------------------
143
144 extern wxLibraries wxTheLibraries;
145
146 // ----------------------------------------------------------------------------
147 // Interesting defines
148 // ----------------------------------------------------------------------------
149
150 #define WXDLL_ENTRY_FUNCTION() \
151 extern "C" wxClassInfo *wxGetClassFirst(); \
152 wxClassInfo *wxGetClassFirst() { \
153 return wxClassInfo::GetFirst(); \
154 }
155
156 #endif // wxUSE_DYNLIB_CLASS
157
158 #endif // _WX_DYNLIB_H__