From edce20642b6d177ee9877775cbfa9e05ebb4e404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Ankarstr=C3=B6m?= Date: Tue, 2 Aug 2022 23:31:21 +0200 Subject: Replace maybe_make. It seems unnecessary to throw exceptions when simply checking whether a library exists. --- c/common.cpp | 10 ++++++++++ c/common.h | 21 ++------------------- c/main.cpp | 9 +++++---- 3 files changed, 17 insertions(+), 23 deletions(-) diff --git a/c/common.cpp b/c/common.cpp index fcf1da2..5d786da 100644 --- a/c/common.cpp +++ b/c/common.cpp @@ -1,3 +1,4 @@ +#include #include #include "common.h" @@ -104,6 +105,15 @@ const wchar_t* Win32Error::WhatW() const noexcept /* Library: Wrapper for loading and freeing dynamically linked libraries. */ +std::optional Library::Maybe(const wchar_t* const lib) +{ + HMODULE hModule = LoadLibrary(lib); + if (!hModule) return {}; + return Library(hModule); +} + +Library::Library(const HMODULE hModule) : m_hModule(hModule) {} + Library::Library(const wchar_t* const lib) { m_hModule = LoadLibrary(lib); diff --git a/c/common.h b/c/common.h index d908d12..0851bb6 100644 --- a/c/common.h +++ b/c/common.h @@ -5,12 +5,6 @@ #include #include -#ifdef UNICODE -#define WA "W" -#else -#define WA "A" -#endif - int EBMessageBox(const wchar_t* wszText, const wchar_t* wszCaption, unsigned uType); int GetRelativeCursorPos(HWND hWnd, POINT* pt); @@ -46,10 +40,12 @@ private: struct Library { + static std::optional Maybe(const wchar_t* lib); Library(const wchar_t* lib); ~Library(); template T* GetProcAddress(const char* szProc); private: + Library(HMODULE hModule); HMODULE m_hModule; }; @@ -65,19 +61,6 @@ inline int wszf(wchar_t (&buf)[N], const wchar_t* const fmt, T... xs) return _snwprintf_s(buf, N, _TRUNCATE, fmt, xs...); } -/* Create and return an object of type C. If construction fails, - * return nothing. The returned value must be checked before being - * used, as dereferencing is undefined if the value is empty. */ -template -std::optional maybe_make(U... xs) -{ - try { - return T(xs...); - } catch (...) { - return {}; - } -} - /* Variable template for caching values from GetSystemMetrics. */ template auto Metric = GetSystemMetrics(I); diff --git a/c/main.cpp b/c/main.cpp index d76225e..32187c8 100644 --- a/c/main.cpp +++ b/c/main.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -165,16 +166,16 @@ static LRESULT CALLBACK CBTProc(const int nCode, const WPARAM wParam, const LPAR g_hWnd = (HWND)wParam; /* Look up constants. */ - if (auto lib = maybe_make(L"User32.dll"); + if (auto lib = Library::Maybe(L"User32.dll"); auto GetDpiForWindow = lib->GetProcAddress("GetDpiForWindow")) g_dpi = GetDpiForWindow(g_hWnd); - if (auto lib = maybe_make(L"uxtheme.dll"); + if (auto lib = Library::Maybe(L"uxtheme.dll"); lib->GetProcAddress("SetWindowTheme")) g_bThemes = 1; - if (auto lib = maybe_make(L"User32.dll"); - lib->GetProcAddress("SystemParametersInfo" WA)) { + if (auto lib = Library::Maybe(L"User32.dll"); + lib->GetProcAddress("SystemParametersInfoW")) { NONCLIENTMETRICS m; m.cbSize = sizeof(NONCLIENTMETRICS); require(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, -- cgit v1.2.3