#pragma hdrstop
#endif //__BORLANDC__
+#if wxUSE_DYNLIB_CLASS
+
#include "wx/dynlib.h"
#include "wx/filefn.h"
#include "wx/intl.h"
#include "wx/log.h"
+#include "wx/tokenzr.h"
// ----------------------------------------------------------------------------
// conditional compilation
// ----------------------------------------------------------------------------
#if defined(HAVE_DLOPEN)
- #define wxDllOpen(lib) dlopen(lib, RTLD_LAZY)
- #define wxDllGetSymbol(handle, name) dlsym(handle, (char *)name)
+ #define wxDllOpen(lib) dlopen(lib.fn_str(), RTLD_LAZY)
+ #define wxDllGetSymbol(handle, name) dlsym(handle, name.mb_str())
#define wxDllClose dlclose
-#elif defined(HAVE_SHLLOAD)
- #define wxDllOpen(lib) shl_open(lib, BIND_DEFERRED, 0)
+#elif defined(HAVE_SHL_LOAD)
+ #define wxDllOpen(lib) shl_load(lib.fn_str(), BIND_DEFERRED, 0)
#define wxDllClose shl_unload
- static inline void *wxDllGetSymbol(shl_t *handle, const char *name)
+ static inline void *wxDllGetSymbol(shl_t handle, const wxString& name)
{
void *sym;
- if ( shl_findsym(handle, name, TYPE_UNDEFINED, &sym) == 0 )
+ if ( shl_findsym(&handle, name.mb_str(), TYPE_UNDEFINED, &sym) == 0 )
return sym;
else
return (void *)0;
}
#elif defined(__WINDOWS__)
- #define wxDllOpen(lib) ::LoadLibrary(lib)
+ #include <windows.h>
+
+ // using LoadLibraryEx under Win32 to avoid name clash with LoadLibrary
+ #ifdef __WIN32__
+ #define wxDllOpen(lib) ::LoadLibraryEx(lib, 0, 0)
+ #else // Win16
+ #define wxDllOpen(lib) ::LoadLibrary(lib)
+ #endif // Win32/16
#define wxDllGetSymbol(handle, name) ::GetProcAddress(handle, name)
#define wxDllClose ::FreeLibrary
#else
wxString fullname(basename);
#if defined(__UNIX__)
- fullname << ".so";
+ #if defined(__HPUX__)
+ fullname << ".sl";
+ #else //__HPUX__
+ fullname << ".so";
+ #endif //__HPUX__
#elif defined(__WINDOWS__)
fullname << ".dll";
#endif
symbol = (void *)symAddress ;
}
#else
- // VZ: hmm... why is WXSTRINGCAST needed? if it's really modified, we
- // should make a copy of it
- symbol = wxDllGetSymbol(m_handle, WXSTRINGCAST symbname);
+ symbol = wxDllGetSymbol(m_handle, symbname);
#endif
if ( !symbol )
wxString lib_name = ConstructLibraryName(name);
#if defined(__UNIX__)
- // TODO use LD_LIBRARY_PATH!
- lib_name.Prepend("/lib");
+ // found the first file in LD_LIBRARY_PATH with this name
+ wxString libPath("/lib:/usr/lib"); // system path first
+ const char *envLibPath = getenv("LD_LIBRARY_PATH");
+ if ( envLibPath )
+ libPath << ':' << envLibPath;
+ wxStringTokenizer tokenizer(libPath, _T(':'));
+ while ( tokenizer.HasMoreToken() )
+ {
+ wxString fullname(tokenizer.NextToken());
+
+ fullname << '/' << lib_name;
+ if ( wxFileExists(fullname) )
+ {
+ lib_name = fullname;
+
+ // found the library
+ break;
+ }
+ }
+ //else: not found in the path, leave the name as is (secutiry risk?)
+
#endif // __UNIX__
- wxDllType handle ;
+ wxDllType handle;
#if defined(__WXMAC__)
FSSpec myFSSpec ;
}
return NULL;
}
+
+#endif // wxUSE_DYNLIB_CLASS