// ************************************************************************** // * 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::SysDllFun isWow64Process(L"kernel32.dll", "IsWow64Process"); if (isWow64Process) ... use function ptr ... */ template class DllFun { public: DllFun() : fun(nullptr) {} DllFun(const wchar_t* libraryName, const char* functionName) : hLibRef(new HMODULE(::LoadLibrary(libraryName)), deleter), fun(*hLibRef ? reinterpret_cast(::GetProcAddress(*hLibRef, functionName)) : nullptr) {} 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(nullptr) {} SysDllFun(const wchar_t* systemLibrary, const char* functionName) { HMODULE mod = ::GetModuleHandle(systemLibrary); fun = mod ? reinterpret_cast(::GetProcAddress(mod, functionName)) : nullptr; } 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); //--------------- implementation--------------------------------------------------- inline std::string getResourceStream(const wchar_t* libraryName, size_t resourceId) { if (HMODULE module = ::LoadLibrary(libraryName)) { ZEN_ON_SCOPE_EXIT(::FreeLibrary(module)); if (HRSRC res = ::FindResource(module, MAKEINTRESOURCE(resourceId), RT_RCDATA)) { if (HGLOBAL resHandle = ::LoadResource(module, res)) { if (const char* stream = static_cast(::LockResource(resHandle))) return std::string(stream, static_cast(::SizeofResource(module, res))); //size is 0 on error } } } return std::string(); } } #endif // DLLLOADER_H_INCLUDED