]> git.saurik.com Git - wxWidgets.git/blame - include/wx/dynlib.h
restored (and slightly improved) wxImage::Scale() fix
[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
ed58dbea 19#include "wx/setup.h"
8a0d4cf6
VZ
20
21#if wxUSE_DYNLIB_CLASS
22
ed58dbea
RR
23#include "wx/string.h"
24#include "wx/list.h"
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
1a787c5d
SN
36// Note: WXPM/EMX has to be tested first, since we want to use
37// native version, even if configure detected presence of DLOPEN.
38#if defined(__WXPM__) || defined(__EMX__)
39# define INCL_DOS
40# include <os2.h>
41 typedef HMODULE wxDllType;
42#elif defined(HAVE_DLOPEN)
a585ca5c 43# include <dlfcn.h>
7b0bfbb2 44 typedef void *wxDllType;
8a0d4cf6 45#elif defined(HAVE_SHL_LOAD)
a585ca5c 46# include <dl.h>
8a0d4cf6 47 typedef shl_t wxDllType;
7b0bfbb2 48#elif defined(__WINDOWS__)
3c1a88d8 49# include <windows.h> // needed to get HMODULE
7b0bfbb2 50 typedef HMODULE wxDllType;
03e11df5
GD
51#elif defined(__APPLE__) && defined(__UNIX__)
52 typedef void *wxDllType;
7b0bfbb2
VZ
53#elif defined(__WXMAC__)
54 typedef CFragConnectionID wxDllType;
55#else
a585ca5c 56# error "wxLibrary can't be compiled on this platform, sorry."
7b0bfbb2
VZ
57#endif // OS
58
7cc98b3e
VZ
59// LoadLibrary is defined in windows.h as LoadLibraryA, but wxDllLoader method
60// should be called LoadLibrary, not LoadLibraryA or LoadLibraryW!
61#if defined(__WIN32__) && defined(LoadLibrary)
62# include "wx/msw/winundef.h"
7c0f3a1e 63#endif
0c32066b 64
a585ca5c
KB
65// ----------------------------------------------------------------------------
66// wxDllLoader
67// ----------------------------------------------------------------------------
3c1a88d8 68
a585ca5c
KB
69/** wxDllLoader is a class providing an interface similar to unix's
70 dlopen(). It is used by the wxLibrary framework and manages the
71 actual loading of DLLs and the resolving of symbols in them.
72 There are no instances of this class, it simply serves as a
73 namespace for its static member functions.
74*/
b97a2c53 75class WXDLLEXPORT wxDllLoader
a585ca5c 76{
3c1a88d8
VZ
77public:
78 /** This function loads a shared library into memory, with libname
79 being the basename of the library, without the filename
80 extension. No initialisation of the library will be done.
81 @param libname Name of the shared object to load.
82 @param success Must point to a bool variable which will be set to TRUE or FALSE.
83 @return A handle to the loaded DLL. Use success parameter to test if it is valid.
84 */
85 static wxDllType LoadLibrary(const wxString & libname, bool *success = NULL);
86 /** This function unloads the shared library. */
87 static void UnloadLibrary(wxDllType dll);
88 /** This function returns a valid handle for the main program
89 itself. */
90 static wxDllType GetProgramHandle(void);
91 /** This function resolves a symbol in a loaded DLL, such as a
92 variable or function name.
93 @param dllHandle Handle of the DLL, as returned by LoadDll().
94 @param name Name of the symbol.
95 @return A pointer to the symbol.
96 */
97 static void * GetSymbol(wxDllType dllHandle, const wxString &name);
98
f6bcfd97
BP
99 // return the standard DLL extension (with leading dot) for this platform
100 static wxString GetDllExt();
101
3c1a88d8
VZ
102private:
103 /// forbid construction of objects
104 wxDllLoader();
a585ca5c
KB
105};
106
7b0bfbb2 107// ----------------------------------------------------------------------------
7a4b9130 108// wxLibrary
7b0bfbb2 109// ----------------------------------------------------------------------------
7a4b9130 110
b97a2c53 111class WXDLLEXPORT wxLibrary : public wxObject
7b0bfbb2
VZ
112{
113public:
114 wxHashTable classTable;
f4a8c29f 115
7b0bfbb2 116public:
8a0d4cf6 117 wxLibrary(wxDllType handle);
7b0bfbb2 118 ~wxLibrary();
7a4b9130 119
7b0bfbb2
VZ
120 // Get a symbol from the dynamic library
121 void *GetSymbol(const wxString& symbname);
7a4b9130 122
7b0bfbb2
VZ
123 // Create the object whose classname is "name"
124 wxObject *CreateObject(const wxString& name);
7a4b9130 125
7b0bfbb2
VZ
126protected:
127 void PrepareClasses(wxClassInfo *first);
f4a8c29f 128
7b0bfbb2 129 wxDllType m_handle;
7a4b9130
GL
130};
131
a585ca5c
KB
132
133
7b0bfbb2 134// ----------------------------------------------------------------------------
7a4b9130 135// wxLibraries
7b0bfbb2
VZ
136// ----------------------------------------------------------------------------
137
b97a2c53 138class WXDLLEXPORT wxLibraries
7b0bfbb2
VZ
139{
140public:
141 wxLibraries();
142 ~wxLibraries();
7a4b9130 143
7b0bfbb2
VZ
144 // caller is responsible for deleting the returned pointer if !NULL
145 wxLibrary *LoadLibrary(const wxString& basename);
7a4b9130 146
7b0bfbb2
VZ
147 wxObject *CreateObject(const wxString& name);
148
149protected:
150 wxList m_loaded;
7a4b9130
GL
151};
152
7b0bfbb2 153// ----------------------------------------------------------------------------
7a4b9130 154// Global variables
7b0bfbb2 155// ----------------------------------------------------------------------------
7a4b9130
GL
156
157extern wxLibraries wxTheLibraries;
158
7b0bfbb2 159// ----------------------------------------------------------------------------
7a4b9130 160// Interesting defines
7b0bfbb2 161// ----------------------------------------------------------------------------
7a4b9130 162
f4a8c29f 163#define WXDLL_ENTRY_FUNCTION() \
856d2e52
GL
164extern "C" wxClassInfo *wxGetClassFirst(); \
165wxClassInfo *wxGetClassFirst() { \
166 return wxClassInfo::GetFirst(); \
f4a8c29f 167}
7a4b9130 168
8a0d4cf6
VZ
169#endif // wxUSE_DYNLIB_CLASS
170
7b0bfbb2 171#endif // _WX_DYNLIB_H__