Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "Plugin_private.h"
00025
00026 #include "AlvarException.h"
00027
00028 #include <windows.h>
00029 #include <sstream>
00030
00031 namespace alvar {
00032
00033 class PluginPrivateData
00034 {
00035 public:
00036 PluginPrivateData()
00037 : mHandle(NULL)
00038 {
00039 }
00040
00041 HINSTANCE mHandle;
00042 };
00043
00044 PluginPrivate::PluginPrivate()
00045 : d(new PluginPrivateData())
00046 {
00047 }
00048
00049 PluginPrivate::~PluginPrivate()
00050 {
00051 delete d;
00052 }
00053
00054 void PluginPrivate::load(const std::string filename)
00055 {
00056 d->mHandle = LoadLibrary(filename.data());
00057 if (!d->mHandle) {
00058 std::stringstream message;
00059 message << "could not load " << filename
00060 << ", error code " << GetLastError();
00061 throw AlvarException(message.str().data());
00062 }
00063 }
00064
00065 void PluginPrivate::unload()
00066 {
00067 FreeLibrary(d->mHandle);
00068 }
00069
00070 void *PluginPrivate::resolve(const char *symbol)
00071 {
00072 void *address = (void *)GetProcAddress(d->mHandle, symbol);
00073 if (!address) {
00074 std::stringstream message;
00075 message << "could not resolve " << symbol;
00076 throw AlvarException(message.str().data());
00077 }
00078 return address;
00079 }
00080
00081 }