X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3e4efd7cb97cb2b3d33f34d3516b6f2efdaa3bfa..5527476f67f7313aeea0d16b2fe366e5a5ddb493:/include/wx/dynlib.h diff --git a/include/wx/dynlib.h b/include/wx/dynlib.h index 0419db3579..067dea6d3a 100644 --- a/include/wx/dynlib.h +++ b/include/wx/dynlib.h @@ -13,56 +13,108 @@ #define _WX_DYNLIB_H__ #ifdef __GNUG__ - #pragma interface +# pragma interface #endif -#include -#include -#include - -// TODO should be done by configure -#if defined(__UNIX__) && !(defined(HAVE_DLOPEN) || defined(HAVE_SHLLOAD)) - #if defined(__LINUX__) || defined(__SOLARIS__) || defined(__SUNOS__) || defined(__FREEBSD__) - #define HAVE_DLOPEN - #elif defined(__HPUX__) - #define HAVE_SHLLOAD - #endif // Unix flavour -#endif // !Unix or already have some HAVE_xxx defined +#include "wx/setup.h" -#if defined(HAVE_DLOPEN) - #include +#if wxUSE_DYNLIB_CLASS - typedef void *wxDllType; -#elif defined(HAVE_SHLLOAD) - #include +#include "wx/string.h" +#include "wx/list.h" +#include "wx/hash.h" +// this is normally done by configure, but I leave it here for now... +#if defined(__UNIX__) && !(defined(HAVE_DLOPEN) || defined(HAVE_SHL_LOAD)) +# if defined(__LINUX__) || defined(__SOLARIS__) || defined(__SUNOS__) || defined(__FREEBSD__) +# define HAVE_DLOPEN +# elif defined(__HPUX__) +# define HAVE_SHL_LOAD +# endif // Unix flavour +#endif // !Unix or already have some HAVE_xxx defined + +// Note: WXPM/EMX has to be tested first, since we want to use +// native version, even if configure detected presence of DLOPEN. +#if defined(__WXPM__) || defined(__EMX__) +# define INCL_DOS +# include + typedef HMODULE wxDllType; +#elif defined(HAVE_DLOPEN) +# include typedef void *wxDllType; +#elif defined(HAVE_SHL_LOAD) +# include + typedef shl_t wxDllType; #elif defined(__WINDOWS__) - #include - +# include // needed to get HMODULE typedef HMODULE wxDllType; +#elif defined(__APPLE__) && defined(__UNIX__) + typedef void *wxDllType; #elif defined(__WXMAC__) typedef CFragConnectionID wxDllType; #else - #error "wxLibrary can't be compiled on this platform, sorry." +# error "wxLibrary can't be compiled on this platform, sorry." #endif // OS -// defined in windows.h -#ifdef LoadLibrary - #undef LoadLibrary +// LoadLibrary is defined in windows.h as LoadLibraryA, but wxDllLoader method +// should be called LoadLibrary, not LoadLibraryA or LoadLibraryW! +#if defined(__WIN32__) && defined(LoadLibrary) +# include "wx/msw/winundef.h" #endif +// ---------------------------------------------------------------------------- +// wxDllLoader +// ---------------------------------------------------------------------------- + +/** wxDllLoader is a class providing an interface similar to unix's + dlopen(). It is used by the wxLibrary framework and manages the + actual loading of DLLs and the resolving of symbols in them. + There are no instances of this class, it simply serves as a + namespace for its static member functions. +*/ +class WXDLLEXPORT wxDllLoader +{ +public: + /** This function loads a shared library into memory, with libname + being the basename of the library, without the filename + extension. No initialisation of the library will be done. + @param libname Name of the shared object to load. + @param success Must point to a bool variable which will be set to TRUE or FALSE. + @return A handle to the loaded DLL. Use success parameter to test if it is valid. + */ + static wxDllType LoadLibrary(const wxString & libname, bool *success = NULL); + /** This function unloads the shared library. */ + static void UnloadLibrary(wxDllType dll); + /** This function returns a valid handle for the main program + itself. */ + static wxDllType GetProgramHandle(void); + /** This function resolves a symbol in a loaded DLL, such as a + variable or function name. + @param dllHandle Handle of the DLL, as returned by LoadDll(). + @param name Name of the symbol. + @return A pointer to the symbol. + */ + static void * GetSymbol(wxDllType dllHandle, const wxString &name); + + // return the standard DLL extension (with leading dot) for this platform + static wxString GetDllExt(); + +private: + /// forbid construction of objects + wxDllLoader(); +}; + // ---------------------------------------------------------------------------- // wxLibrary // ---------------------------------------------------------------------------- -class wxLibrary : public wxObject +class WXDLLEXPORT wxLibrary : public wxObject { public: wxHashTable classTable; public: - wxLibrary(void *handle); + wxLibrary(wxDllType handle); ~wxLibrary(); // Get a symbol from the dynamic library @@ -77,11 +129,13 @@ protected: wxDllType m_handle; }; + + // ---------------------------------------------------------------------------- // wxLibraries // ---------------------------------------------------------------------------- -class wxLibraries +class WXDLLEXPORT wxLibraries { public: wxLibraries(); @@ -112,4 +166,6 @@ wxClassInfo *wxGetClassFirst() { \ return wxClassInfo::GetFirst(); \ } +#endif // wxUSE_DYNLIB_CLASS + #endif // _WX_DYNLIB_H__