Listing 5
// WinSharedLibrary.cxx
#include "SharedLibrary.h"
#include <windows.h>
#include <string.h>
#include <iostream>
using namespace std;
class WinSharedLibrary : public SharedLibrary
{
public:
WinSharedLibrary(const char* name)
throw (SharedLibraryException);
~WinSharedLibrary();
void* findSymbol(const char* name)
throw (SharedLibraryException);
private:
HINSTANCE m_handle;
};
SharedLibrary* SharedLibrary::openSharedLibrary(const char* name)
throw (SharedLibraryException)
{
return new WinSharedLibrary(name);
}
WinSharedLibrary::WinSharedLibrary(const char* name)
throw (SharedLibraryException)
: m_handle(0)
{
m_handle = LoadLibrary(name);
if (m_handle == 0)
{
char buffer[255];
strcpy(buffer,"Open Library Failure");
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError(),
0, buffer,sizeof(buffer),0);
throw SharedLibraryException(buffer);
}
}
WinSharedLibrary::~WinSharedLibrary()
{
if (!FreeLibrary(m_handle))
{
char buffer[255];
// format buffer as above
cerr << buffer << endl;
}
}
void* WinSharedLibrary::findSymbol(const char* name)
throw (SharedLibraryException)
{
void* sym = GetProcAddress(m_handle,name);
if (sym == 0)
{
char buffer[255];
// format buffer as above
throw SharedLibraryException(buffer);
}
else
return sym;
}