diff options
-rw-r--r-- | c/common.cpp | 26 | ||||
-rw-r--r-- | c/defs.h | 16 | ||||
-rw-r--r-- | c/main.cpp | 36 |
3 files changed, 56 insertions, 22 deletions
diff --git a/c/common.cpp b/c/common.cpp index 63adb53..93f97eb 100644 --- a/c/common.cpp +++ b/c/common.cpp @@ -1,3 +1,4 @@ +#include <memory> #include <windows.h> #include <SWI-Prolog.h> @@ -27,3 +28,28 @@ TszFromSz(const char *sz, int iCp) return tsz; } + +Library::Library(const TCHAR *tszLibrary) +{ + m_hModule = LoadLibrary(tszLibrary); +} + +Library::~Library() +{ + if (m_hModule) + FreeLibrary(m_hModule); +} + +FARPROC +Library::GetProcAddress(const char *szProc) +{ + return m_hModule? ::GetProcAddress(m_hModule, szProc): NULL; +} + +std::unique_ptr<Library> +Library::Load(const TCHAR *tszLibrary) +{ + auto upLib = std::make_unique<Library>(tszLibrary); + if (!upLib->m_hModule) upLib = nullptr; + return upLib; +} @@ -1,12 +1,22 @@ #ifndef DEFS_H #define DEFS_H +#include <memory> #include <windows.h> #include <commctrl.h> #include <SWI-Prolog.h> /* common.cpp */ TCHAR *TszFromSz(const char *, int); +class Library { +private: + HMODULE m_hModule; +public: + static std::unique_ptr<Library> Load(const TCHAR *); + Library(const TCHAR *); + ~Library(); + FARPROC GetProcAddress(const char *); +}; /* main.cpp */ void UpdateLayout(); @@ -61,6 +71,12 @@ int Plp(term_t, const char *, ...); int Plg(term_t, const char *, ...); /* defs.h */ +#ifdef UNICODE +#define WA "W" +#else +#define WA "A" +#endif + #define DLVSIKEY 0 #define DLVSIVALUE 1 #define ELVSIEPISODE 0 @@ -3,8 +3,6 @@ #include <uxtheme.h> #include <SWI-Prolog.h> -#include <cstdio> - #include "resource.h" #include "defs.h" @@ -36,26 +34,23 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) { - HMODULE hModule; LPTSTR tszErr; /* Set constant values. */ - hModule = LoadLibrary(TEXT("uxtheme.dll")); - if (hModule && GetProcAddress(hModule, "SetWindowTheme")) { - g_bThemes = 1; - FreeLibrary(hModule); - } + if (auto upLib = Library::Load(TEXT("uxtheme.dll"))) + if (upLib->GetProcAddress("SetWindowTheme")) { + g_bThemes = 1; + } g_cxVScroll = GetSystemMetrics(SM_CXVSCROLL); /* Setup fonts. */ - hModule = LoadLibrary(TEXT("User32.dll")); - if (hModule && GetProcAddress(hModule, "SystemParametersInfoW")) { - NONCLIENTMETRICS m; - m.cbSize = sizeof(NONCLIENTMETRICS); - SystemParametersInfo(SPI_GETNONCLIENTMETRICS, - sizeof(NONCLIENTMETRICS), &m, 0); - g_hfNormal = CreateFontIndirect(&m.lfMessageFont); - FreeLibrary(hModule); + if (auto upLib = Library::Load(TEXT("User32.dll"))) { + if (upLib->GetProcAddress("SystemParametersInfo" WA)) { + NONCLIENTMETRICS m; + m.cbSize = sizeof(NONCLIENTMETRICS); + SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &m, 0); + g_hfNormal = CreateFontIndirect(&m.lfMessageFont); + } } else g_hfNormal = static_cast<HFONT>(GetStockObject(DEFAULT_GUI_FONT)); @@ -147,12 +142,9 @@ CBTProc(int nCode, WPARAM wParam, LPARAM lParam) g_hWnd = (HWND)wParam; /* Get DPI. */ - UINT (*GetDpiForWindow)(HWND); - HMODULE hModule = LoadLibrary(TEXT("User32.dll")); - if (hModule && (GetDpiForWindow = (UINT (*)(HWND))GetProcAddress(hModule, "GetDpiForWindow"))) { - g_iDPI = GetDpiForWindow(g_hWnd); - FreeLibrary(hModule); - } + if (auto upLib = Library::Load(TEXT("User32.dll"))) + if (auto GetDpiForWindow = (UINT (*)(HWND))upLib->GetProcAddress("GetDpiForWindow")) + g_iDPI = GetDpiForWindow(g_hWnd); /* Create child windows. */ g_lpDlv = new DataListView; |