- // The following symbol are unique to 4.71
- // DllInstall
- // FlatSB_EnableScrollBar FlatSB_GetScrollInfo FlatSB_GetScrollPos
- // FlatSB_GetScrollProp FlatSB_GetScrollRange FlatSB_SetScrollInfo
- // FlatSB_SetScrollPos FlatSB_SetScrollProp FlatSB_SetScrollRange
- // FlatSB_ShowScrollBar
- // _DrawIndirectImageList _DuplicateImageList
- // InitializeFlatSB
- // UninitializeFlatSB
- // we could check for any of these - I chose DllInstall
- FARPROC theProc = ::GetProcAddress(theModule, "DllInstall");
- if (! theProc)
- {
- // not found, must be 4.70
- version = 470;
- }
- else
- { // found, must be 4.71
- version = 471;
- }
+ // try to use DllGetVersion() if available in _headers_
+ #ifdef DLLVER_PLATFORM_WINDOWS // defined in shlwapi.h
+ DLLGETVERSIONPROC pfnDllGetVersion = (DLLGETVERSIONPROC)
+ ::GetProcAddress(hModuleComCtl32, "DllGetVersion");
+ if ( pfnDllGetVersion )
+ {
+ DLLVERSIONINFO dvi;
+ dvi.cbSize = sizeof(dvi);
+
+ HRESULT hr = (*pfnDllGetVersion)(&dvi);
+ if ( FAILED(hr) )
+ {
+ wxLogApiError(_T("DllGetVersion"), hr);
+ }
+ else
+ {
+ // this is incompatible with _WIN32_IE values, but
+ // compatible with the other values returned by
+ // GetComCtl32Version()
+ s_verComCtl32 = 100*dvi.dwMajorVersion +
+ dvi.dwMinorVersion;
+ }
+ }
+ #endif
+ // DllGetVersion() unavailable either during compile or
+ // run-time, try to guess the version otherwise
+ if ( !s_verComCtl32 )
+ {
+ // InitCommonControlsEx is unique to 4.70 and later
+ FARPROC theProc = ::GetProcAddress
+ (
+ hModuleComCtl32,
+ "InitCommonControlsEx"
+ );
+
+ if ( !theProc )
+ {
+ // not found, must be 4.00
+ s_verComCtl32 = 400;
+ }
+ else
+ {
+ // many symbols appeared in comctl32 4.71, could use
+ // any of them except may be DllInstall
+ theProc = ::GetProcAddress
+ (
+ hModuleComCtl32,
+ "InitializeFlatSB"
+ );
+ if ( !theProc )
+ {
+ // not found, must be 4.70
+ s_verComCtl32 = 470;
+ }
+ else
+ {
+ // found, must be 4.71
+ s_verComCtl32 = 471;
+ }
+ }
+ }