#include "dllLoader.h" #include //includes "windows.h" #include #include namespace { class DllHandler //dynamically load "kernel32.dll" { public: static DllHandler& getInstance() { static DllHandler instance; return instance; } HINSTANCE getHandle(const std::wstring& libraryName) { HandleMap::const_iterator foundEntry = handles.find(libraryName); if (foundEntry == handles.end()) { HINSTANCE newHandle = ::LoadLibrary(libraryName.c_str()); handles.insert(std::make_pair(libraryName, newHandle)); assert(handles.find(libraryName) != handles.end()); return newHandle; } else return foundEntry->second; } private: DllHandler() {} ~DllHandler() { for (HandleMap::const_iterator i = handles.begin(); i != handles.end(); ++i) if (i->second != NULL) ::FreeLibrary(i->second); } typedef std::map HandleMap; HandleMap handles; }; } void* Utility::loadSymbol(const std::wstring& libraryName, const std::string& functionName) { const HINSTANCE libHandle = DllHandler::getInstance().getHandle(libraryName); if (libHandle != NULL) return reinterpret_cast(::GetProcAddress(libHandle, functionName.c_str())); else return NULL; }