]> git.saurik.com Git - wxWidgets.git/blame - include/wx/dynlib.h
1. wxGrid fixes contributed by Gerhard Gruber (client data for cells...)
[wxWidgets.git] / include / wx / dynlib.h
CommitLineData
7b0bfbb2
VZ
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
34138703
JS
12#ifndef _WX_DYNLIB_H__
13#define _WX_DYNLIB_H__
7a4b9130
GL
14
15#ifdef __GNUG__
a585ca5c 16# pragma interface
7a4b9130
GL
17#endif
18
8a0d4cf6
VZ
19#include <wx/setup.h>
20
21#if wxUSE_DYNLIB_CLASS
22
7a4b9130
GL
23#include <wx/string.h>
24#include <wx/list.h>
f4a8c29f 25#include <wx/hash.h>
7a4b9130 26
8a0d4cf6
VZ
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))
a585ca5c
KB
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
3e4efd7c
VZ
34#endif // !Unix or already have some HAVE_xxx defined
35
7b0bfbb2 36#if defined(HAVE_DLOPEN)
a585ca5c 37# include <dlfcn.h>
7b0bfbb2 38 typedef void *wxDllType;
8a0d4cf6 39#elif defined(HAVE_SHL_LOAD)
a585ca5c 40# include <dl.h>
8a0d4cf6 41 typedef shl_t wxDllType;
7b0bfbb2 42#elif defined(__WINDOWS__)
a585ca5c 43# include <windows.h>
7b0bfbb2
VZ
44 typedef HMODULE wxDllType;
45#elif defined(__WXMAC__)
46 typedef CFragConnectionID wxDllType;
47#else
a585ca5c 48# error "wxLibrary can't be compiled on this platform, sorry."
7b0bfbb2
VZ
49#endif // OS
50
51// defined in windows.h
7c0f3a1e
UU
52// This breaks app.cpp if RICHEDIT is included.
53#if 0
0c32066b 54#ifdef LoadLibrary
a585ca5c 55# undef LoadLibrary
0c32066b 56#endif
7c0f3a1e 57#endif
0c32066b 58
a585ca5c
KB
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*/
68class 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 */
4dc2c3bb 78 static wxDllType LoadLibrary(const wxString & libname, bool *success);
a585ca5c
KB
79 /** This function resolves a symbol in a loaded DLL, such as a
80 variable or function name.
81 @param dllHandle Handle of the DLL, as returned by LoadDll().
82 @param name Name of the symbol.
83 @return A pointer to the symbol.
84 */
85 static void * GetSymbol(wxDllType dllHandle, const wxString &name);
86 private:
87 /// forbid construction of objects
3d2afb7a 88 wxDllLoader();
a585ca5c
KB
89};
90
7b0bfbb2 91// ----------------------------------------------------------------------------
7a4b9130 92// wxLibrary
7b0bfbb2 93// ----------------------------------------------------------------------------
7a4b9130 94
7b0bfbb2
VZ
95class wxLibrary : public wxObject
96{
97public:
98 wxHashTable classTable;
f4a8c29f 99
7b0bfbb2 100public:
8a0d4cf6 101 wxLibrary(wxDllType handle);
7b0bfbb2 102 ~wxLibrary();
7a4b9130 103
7b0bfbb2
VZ
104 // Get a symbol from the dynamic library
105 void *GetSymbol(const wxString& symbname);
7a4b9130 106
7b0bfbb2
VZ
107 // Create the object whose classname is "name"
108 wxObject *CreateObject(const wxString& name);
7a4b9130 109
7b0bfbb2
VZ
110protected:
111 void PrepareClasses(wxClassInfo *first);
f4a8c29f 112
7b0bfbb2 113 wxDllType m_handle;
7a4b9130
GL
114};
115
a585ca5c
KB
116
117
7b0bfbb2 118// ----------------------------------------------------------------------------
7a4b9130 119// wxLibraries
7b0bfbb2
VZ
120// ----------------------------------------------------------------------------
121
122class wxLibraries
123{
124public:
125 wxLibraries();
126 ~wxLibraries();
7a4b9130 127
7b0bfbb2
VZ
128 // caller is responsible for deleting the returned pointer if !NULL
129 wxLibrary *LoadLibrary(const wxString& basename);
7a4b9130 130
7b0bfbb2
VZ
131 wxObject *CreateObject(const wxString& name);
132
133protected:
134 wxList m_loaded;
7a4b9130
GL
135};
136
7b0bfbb2 137// ----------------------------------------------------------------------------
7a4b9130 138// Global variables
7b0bfbb2 139// ----------------------------------------------------------------------------
7a4b9130
GL
140
141extern wxLibraries wxTheLibraries;
142
7b0bfbb2 143// ----------------------------------------------------------------------------
7a4b9130 144// Interesting defines
7b0bfbb2 145// ----------------------------------------------------------------------------
7a4b9130 146
f4a8c29f 147#define WXDLL_ENTRY_FUNCTION() \
856d2e52
GL
148extern "C" wxClassInfo *wxGetClassFirst(); \
149wxClassInfo *wxGetClassFirst() { \
150 return wxClassInfo::GetFirst(); \
f4a8c29f 151}
7a4b9130 152
8a0d4cf6
VZ
153#endif // wxUSE_DYNLIB_CLASS
154
7b0bfbb2 155#endif // _WX_DYNLIB_H__