diff options
Diffstat (limited to 'alf/alfcompat.cpp')
| -rw-r--r-- | alf/alfcompat.cpp | 61 |
1 files changed, 57 insertions, 4 deletions
diff --git a/alf/alfcompat.cpp b/alf/alfcompat.cpp index 452b9bc..3ffc9f9 100644 --- a/alf/alfcompat.cpp +++ b/alf/alfcompat.cpp @@ -1,21 +1,74 @@ #include "alfpriv.h" +#include <shlwapi.h> + +static +DWORD ALF_DllGetVersion(const char *dll) +{ + HMODULE hDll = GetModuleHandleA(dll); + + if (hDll) { + DLLGETVERSIONPROC pDllGetVersion; + pDllGetVersion = (DLLGETVERSIONPROC)(void*)GetProcAddress(hDll, "DllGetVersion"); + + if (pDllGetVersion) { + DLLVERSIONINFO dvi; + HRESULT hr; + + ZeroMemory(&dvi, sizeof(dvi)); + dvi.cbSize = sizeof(dvi); + + hr = (*pDllGetVersion)(&dvi); + + if (SUCCEEDED(hr)) { + return MAKELONG(dvi.dwMinorVersion, dvi.dwMajorVersion); + } + } + } + return 0; +} + +static int WINAPI +fallbackGetSystemMetricsForDpi(int nIndex, UINT dpi) +{ + (void)dpi; + return GetSystemMetrics(nIndex); +} + +static BOOL WINAPI +fallbackIsAppThemed(void) +{ + return FALSE; +} + ALFCompatFunctions * ALF_CreateCompatFuncTable(void) { ALFCompatFunctions *compatfn = (ALFCompatFunctions*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY|HEAP_GENERATE_EXCEPTIONS, sizeof(ALFCompatFunctions)); -#define COMPAT(dll, entrypoint, ordinal) \ +#define COMPAT(dll, entrypoint, ordinal, fallback) \ do { \ FARPROC p = GetProcAddress(GetModuleHandleA(#dll), #entrypoint); \ if (!p && ordinal) \ p = GetProcAddress(GetModuleHandleA(#dll), (char*)ordinal); \ CopyMemory(&compatfn->entrypoint, &p, sizeof(void*)); \ + \ + if (!compatfn->entrypoint) \ + compatfn->entrypoint = fallback; \ } while (0) - COMPAT(comctl32.dll, SetWindowSubclass, 410); - COMPAT(comctl32.dll, DefSubclassProc, 413); - COMPAT(comctl32.dll, RemoveWindowSubclass, 412); + COMPAT(comctl32.dll, SetWindowSubclass, 410, NULL); + COMPAT(comctl32.dll, DefSubclassProc, 413, NULL); + COMPAT(comctl32.dll, RemoveWindowSubclass, 412, NULL); + COMPAT(user32.dll, GetSystemMetricsForDpi, 0, fallbackGetSystemMetricsForDpi); + + // IsAppThemed would return TRUE even when we're linked against comctl32 v5 + if (ALF_DllGetVersion("comctl32.dll") >= 0x60000) { + LoadLibraryA("uxtheme.dll"); + COMPAT(uxtheme.dll, IsAppThemed, 0, fallbackIsAppThemed); + } else { + compatfn->IsAppThemed = fallbackIsAppThemed; + } #undef COMPAT |
