Listing 4
// UnixSharedLibrary.cxx
#include "SharedLibrary.h"
#include <dlfcn.h>
class UnixSharedLibrary : public SharedLibrary
{
public:
UnixSharedLibrary(const char* name)
throw (SharedLibraryException);
~UnixSharedLibrary();
void* findSymbol(const char* name)
throw (SharedLibraryException);
private:
void* m_handle;
};
SharedLibrary* SharedLibrary::openSharedLibrary(const char* name)
throw (SharedLibraryException)
{
return new UnixSharedLibrary(name);
}
UnixSharedLibrary::UnixSharedLibrary(const char* name)
throw (SharedLibraryException)
: m_handle(0)
{
m_handle = dlopen(name,RTLD_NOW|RTLD_GLOBAL);
if (m_handle == 0)
{
const char* s = dlerror();
throw SharedLibraryException(s?s:"Exact Error Not Reported");
}
}
UnixSharedLibrary::~UnixSharedLibrary() { dlclose(m_handle); }
void* UnixSharedLibrary::findSymbol(const char* name)
throw (SharedLibraryException)
{
void* sym = dlsym(m_handle,name);
if (sym == 0)
throw SharedLibraryException("Symbol Not Found");
else
return sym;
}