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;
}