// ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * // * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * // ************************************************************************** // #include "dll_loader.h" #include namespace { class DllHandler { public: static DllHandler& getInstance() { static DllHandler instance; return instance; } HMODULE getHandle(const std::wstring& libraryName) { if (libraryName.empty()) return ::GetModuleHandle(NULL); //return handle to calling executable HandleMap::const_iterator iter = handles.find(libraryName); if (iter != handles.end()) return iter->second; HMODULE newHandle = ::LoadLibrary(libraryName.c_str()); if (newHandle != NULL) handles.insert(std::make_pair(libraryName, newHandle)); return newHandle; } private: DllHandler() {} DllHandler(const DllHandler&); DllHandler& operator=(const DllHandler&); ~DllHandler() { for (HandleMap::const_iterator i = handles.begin(); i != handles.end(); ++i) ::FreeLibrary(i->second); } typedef std::map HandleMap; HandleMap handles; //only valid handles here! }; } FARPROC util::loadSymbol(const std::wstring& libraryName, const std::string& functionName) { const HMODULE libHandle = DllHandler::getInstance().getHandle(libraryName); return libHandle != NULL ? ::GetProcAddress(libHandle, functionName.c_str()) : NULL; } std::string util::getResourceStream(const std::wstring& libraryName, size_t resourceId) { std::string output; const HMODULE module = DllHandler::getInstance().getHandle(libraryName); if (module) { const HRSRC res = ::FindResource(module, MAKEINTRESOURCE(resourceId), RT_RCDATA); if (res != NULL) { const HGLOBAL resHandle = ::LoadResource(module, res); if (resHandle != NULL) { const char* stream = static_cast(::LockResource(resHandle)); if (stream) { const DWORD streamSize = ::SizeofResource(module, res); output.assign(stream, streamSize); } } } } return output; }