#pragma once #define WIN32_LEAN_AND_MEAN #include #include #include #include #define DECLARE_DLL_FUNCTION(NAME) \ std::function NAME = (std::add_pointer_t)GetProcAddress(_library_handle, #NAME); #define DECLARE_DLL_PROVIDER_BEGIN(DLL_NAME) \ class DLL_NAME##APIProvider final \ { \ HMODULE _library_handle; \ DLL_NAME##APIProvider(HMODULE h) : _library_handle{ h } {} \ \ public: \ ~DLL_NAME##APIProvider() { FreeLibrary(_library_handle); } \ static std::optional create() \ { \ HMODULE h = LoadLibraryA(#DLL_NAME ".dll"); \ std::optional result; \ if (!h) \ return result; \ result.emplace(DLL_NAME##APIProvider{ h }); \ return result; \ } #define DECLARE_DLL_PROVIDER_END \ } \ ;