diff --git a/docs/changes.txt b/docs/changes.txt index 11d97fd2ac..810a821e43 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -205,6 +205,7 @@ OTHER CHANGES All: - Norvegian (Bokmål) translation added (Hans F. Nordhaug) +- wxDynamicLibrary::HasSymbol() added All (GUI): diff --git a/docs/latex/wx/dynlib.tex b/docs/latex/wx/dynlib.tex index 61accb8f3d..59ef7f8a82 100644 --- a/docs/latex/wx/dynlib.tex +++ b/docs/latex/wx/dynlib.tex @@ -23,6 +23,7 @@ done in the objects destructor automatically. %\helpref{wxDllLoader}{wxdllloader} + \membersection{wxDynamicLibrary::wxDynamicLibrary}\label{wxdynamiclibrarywxdynamiclibrary} \func{}{wxDynamicLibrary}{\void} @@ -31,6 +32,7 @@ done in the objects destructor automatically. Constructor. Second form calls \helpref{Load}{wxdynamiclibraryload}. + \membersection{wxDynamicLibrary::CanonicalizeName}\label{wxdynamiclibrarycanonicalizename} \func{wxString}{CanonicalizeName}{\param{const wxString\& }{name}, \param{wxDynamicLibraryCategory}{ cat = wxDL\_LIBRARY}} @@ -51,6 +53,7 @@ The possible values for \arg{cat} are: \helpref{CanonicalizePluginName}{wxdynamiclibrarycanonicalizepluginname} + \membersection{wxDynamicLibrary::CanonicalizePluginName}\label{wxdynamiclibrarycanonicalizepluginname} \func{wxString}{CanonicalizePluginName}{\param{const wxString\& }{name}, \param{wxPluginCategory}{ cat = wxDL\_PLUGIN\_GUI}} @@ -68,6 +71,7 @@ The possible values for \arg{cat} are: \twocolitem{wxDL\_PLUGIN\_BASE}{plugin which only uses wxBase} \end{twocollist} + \membersection{wxDynamicLibrary::Detach}\label{wxdynamiclibrarydetach} \func{wxDllType}{Detach}{\void} @@ -76,9 +80,10 @@ Detaches this object from its library handle, i.e. the object will not unload the library any longer in its destructor but it is now the callers responsability to do this using \helpref{Unload}{wxdynamiclibraryunload}. + \membersection{wxDynamicLibrary::GetSymbol}\label{wxdynamiclibrarygetsymbol} -\constfunc{void*}{GetSymbol}{\param{const wxString\& }{name}} +\constfunc{void *}{GetSymbol}{\param{const wxString\& }{name}} Returns pointer to symbol {\it name} in the library or NULL if the library contains no such symbol. @@ -87,12 +92,25 @@ contains no such symbol. \helpref{wxDYNLIB\_FUNCTION}{wxdynlibfunction} + +\membersection{wxDynamicLibrary::HasSymbol}\label{wxdynamiclibraryhassymbol} + +\constfunc{bool}{HasSymbol}{\param{const wxString\& }{name}} + +Returns \true if the symbol with the given \arg{name} is present in the dynamic +library, \false otherwise. Unlike \helpref{GetSymbol}{wxdynamiclibrarygetsymbol}, +this function doesn't log an error message if the symbol is not found. + +\newsince{2.5.4} + + \membersection{wxDynamicLibrary::IsLoaded}\label{wxdynamiclibraryisloaded} \constfunc{bool}{IsLoaded}{\void} Returns \true if the library was successfully loaded, \false otherwise. + \membersection{wxDynamicLibrary::Load}\label{wxdynamiclibraryload} \func{bool}{Load}{\param{const wxString\& }{name}, \param{int }{flags = wxDL\_DEFAULT}} @@ -110,6 +128,7 @@ the library name (this is done by default).} Returns \true if the library was successfully loaded, \false otherwise. + \membersection{wxDynamicLibrary::Unload}\label{wxdynamiclibraryunload} \func{void}{Unload}{\void} diff --git a/include/wx/dynlib.h b/include/wx/dynlib.h index 03da571c63..e163ae2098 100644 --- a/include/wx/dynlib.h +++ b/include/wx/dynlib.h @@ -151,6 +151,16 @@ public: // Return the raw handle from dlopen and friends. wxDllType GetLibHandle() const { return m_handle; } + // check if the given symbol is present in the library, useful to verify if + // a loadable module is our plugin, for example, without provoking error + // messages from GetSymbol() + bool HasSymbol(const wxString& name) const + { + bool ok; + DoGetSymbol(name, &ok); + return ok; + } + // resolve a symbol in a loaded DLL, such as a variable or function name. // 'name' is the (possibly mangled) name of the symbol. (use extern "C" to // export unmangled names) @@ -186,6 +196,10 @@ public: #endif protected: + // the real implementation of GetSymbol() + void *DoGetSymbol(const wxString& name, bool *success = 0) const; + + // platform specific shared lib suffix. static const wxChar *ms_dllext; diff --git a/src/common/dynlib.cpp b/src/common/dynlib.cpp index ec3c142570..e2d60444ec 100644 --- a/src/common/dynlib.cpp +++ b/src/common/dynlib.cpp @@ -314,12 +314,11 @@ void wxDynamicLibrary::Unload(wxDllType handle) #endif } -void *wxDynamicLibrary::GetSymbol(const wxString &name, bool *success) const +void *wxDynamicLibrary::DoGetSymbol(const wxString &name, bool *success) const { wxCHECK_MSG( IsLoaded(), NULL, _T("Can't load symbol from unloaded library") ); - bool failed = false; void *symbol = 0; wxUnusedVar(symbol); @@ -360,6 +359,15 @@ void *wxDynamicLibrary::GetSymbol(const wxString &name, bool *success) const #error "runtime shared lib support not implemented" #endif + if ( success ) + *success = symbol != NULL; + + return symbol; +} + +void *wxDynamicLibrary::GetSymbol(const wxString& name, bool *success) const +{ + void *symbol = DoGetSymbol(name, success); if ( !symbol ) { #if defined(HAVE_DLERROR) && !defined(__EMX__) @@ -376,18 +384,14 @@ void *wxDynamicLibrary::GetSymbol(const wxString &name, bool *success) const wxLogError(wxT("%s"), err); } #else - failed = true; wxLogSysError(_("Couldn't find symbol '%s' in a dynamic library"), name.c_str()); #endif } - if( success ) - *success = !failed; return symbol; } - /*static*/ wxString wxDynamicLibrary::CanonicalizeName(const wxString& name,