// ************************************************************************** // * 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) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef DLLLOADER_H_INCLUDED #define DLLLOADER_H_INCLUDED #include #include #include "scope_guard.h" #include "win.h" //includes "windows.h" namespace zen { /* Manage DLL function and library ownership - thread safety: like built-in type - full value semantics Usage: typedef BOOL (WINAPI* IsWow64ProcessFun)(HANDLE hProcess, PBOOL Wow64Process); const zen::DllFun isWow64Process(L"kernel32.dll", "IsWow64Process"); if (isWow64Process) ... use function ptr ... */ template class DllFun { public: DllFun() : fun(NULL) {} DllFun(const wchar_t* libraryName, const char* functionName) : hLibRef(new HMODULE(::LoadLibrary(libraryName)), deleter), fun(*hLibRef ? reinterpret_cast(::GetProcAddress(*hLibRef, functionName)) : NULL) {} operator Func() const { return fun; } private: static void deleter(HMODULE* ptr) { if (*ptr) ::FreeLibrary(*ptr); delete ptr; } std::shared_ptr hLibRef; Func fun; }; //if the dll is already part of the process space, e.g. "kernel32.dll" or "shell32.dll", we can use a faster variant: //NOTE: since the lifetime of the referenced library is *not* controlled, this is safe to use only for permanently loaded libraries like these! template class SysDllFun { public: SysDllFun() : fun(NULL) {} SysDllFun(const wchar_t* systemLibrary, const char* functionName) : fun(reinterpret_cast(::GetProcAddress(::GetModuleHandle(systemLibrary), functionName))) {} operator Func() const { return fun; } private: Func fun; }; /* extract binary resources from .exe/.dll: -- resource.h -- #define MY_BINARY_RESOURCE 1337 -- resource.rc -- MY_BINARY_RESOURCE RCDATA "filename.dat" */ std::string getResourceStream(const std::wstring& libraryName, size_t resourceId); //---------------Inline Implementation--------------------------------------------------- inline std::string getResourceStream(const wchar_t* libraryName, size_t resourceId) { std::string output; HMODULE module = ::LoadLibrary(libraryName); if (module) { ZEN_ON_BLOCK_EXIT(::FreeLibrary(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; } } #endif // DLLLOADER_H_INCLUDED