// ************************************************************************** // * 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 (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef DLLLOADER_H_INCLUDED #define DLLLOADER_H_INCLUDED #include #ifdef FFS_WIN #include #include "scope_guard.h" #include "win.h" //includes "windows.h" #elif defined FFS_LINUX || defined FFS_MAC #include #endif namespace zen { /* Manage DLL function and library ownership - thread safety: like built-in type - full value semantics Usage: typedef BOOL (WINAPI* FunType_IsWow64Process)(HANDLE hProcess, PBOOL Wow64Process); const zen::SysDllFun isWow64Process(L"kernel32.dll", "IsWow64Process"); if (isWow64Process) ... use function ptr ... Usage 2: #define DEF_DLL_FUN(name) DllFun name(dll_ns::getDllName(), dll_ns::funName_##name); DEF_DLL_FUN(funname1); DEF_DLL_FUN(funname2); DEF_DLL_FUN(funname3); */ template class DllFun { public: DllFun() : fun(nullptr) {} #ifdef FFS_WIN DllFun(const wchar_t* libraryName, const char* functionName) : hLibRef(::LoadLibrary(libraryName), ::FreeLibrary), fun(hLibRef ? reinterpret_cast(::GetProcAddress(static_cast(hLibRef.get()), functionName)) : nullptr) {} #elif defined FFS_LINUX || defined FFS_MAC DllFun(const char* libraryName, const char* functionName) : hLibRef(::dlopen(libraryName, RTLD_LAZY), ::dlclose), fun(hLibRef ? reinterpret_cast(::dlsym(hLibRef.get(), functionName)) : nullptr) {} #endif operator Func() const { return fun; } private: std::shared_ptr hLibRef; //we would prefer decltype(*HMODULE()) if only it would work... Func fun; }; #ifdef FFS_WIN //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); #endif //--------------- implementation--------------------------------------------------- #ifdef FFS_WIN 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 } #endif // DLLLOADER_H_INCLUDED