#include "alfpriv.h" #include 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, 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, 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 return compatfn; }