do *not* redefine DLLVERSIONINFO struct here; do define _WIN32_IE to as high number as possible instead of as low as possible; use wxDynamicLibrary instead of raw FindLibrary/FreeLibrary calls

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22459 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2003-08-01 23:13:19 +00:00
parent 3afc693f07
commit 9fc6c21c03

View File

@@ -51,6 +51,7 @@
#include "wx/apptrait.h"
#include "wx/filename.h"
#include "wx/module.h"
#include "wx/dynlib.h"
#include "wx/msw/private.h"
@@ -102,15 +103,17 @@
// 0x0300 4.70 IE 3.x
// 0x0400 4.71 IE 4.0
// 0x0401 4.72 IE 4.01 and Win98
// 0x0500 5.00 IE 5.x and NT 5.0 (Win2000)
// 0x0500 5.80 IE 5.x
// 0x0500 5.81 Win2k/ME
// 0x0600 6.00 WinXP
#ifndef _WIN32_IE
// minimal set of features by default
#define _WIN32_IE 0x0200
// use maximal set of features by default, we check for them during
// run-time anyhow
#define _WIN32_IE 0x0600
#endif
#if _WIN32_IE >= 0x0300 && \
(!defined(__MINGW32__) || wxCHECK_W32API_VERSION( 2, 0 )) && \
#if (!defined(__MINGW32__) || wxCHECK_W32API_VERSION( 2, 0 )) && \
!defined(__CYGWIN__) && !defined(__WXWINCE__) && \
(!defined(_MSC_VER) || (_MSC_VER > 1100))
#include <shlwapi.h>
@@ -851,16 +854,8 @@ void wxApp::OnQueryEndSession(wxCloseEvent& event)
}
}
typedef struct _WXADllVersionInfo
{
DWORD cbSize;
DWORD dwMajorVersion; // Major version
DWORD dwMinorVersion; // Minor version
DWORD dwBuildNumber; // Build number
DWORD dwPlatformID; // DLLVER_PLATFORM_*
} WXADLLVERSIONINFO;
typedef HRESULT (CALLBACK* WXADLLGETVERSIONPROC)(WXADLLVERSIONINFO *);
#define wxDYNLIB_FUNCTION(type, name, dll) \
type pfn ## name = (type)dll.GetSymbol(_T(#name))
/* static */
int wxApp::GetComCtl32Version()
@@ -869,37 +864,30 @@ int wxApp::GetComCtl32Version()
return 0;
#else
// cache the result
//
// NB: this is MT-ok as in the worst case we'd compute s_verComCtl32 twice,
// but as its value should be the same both times it doesn't matter
static int s_verComCtl32 = -1;
wxCRIT_SECT_DECLARE(csComCtl32);
wxCRIT_SECT_LOCKER(lock, csComCtl32);
if ( s_verComCtl32 == -1 )
{
// initally assume no comctl32.dll at all
s_verComCtl32 = 0;
// we're prepared to handle the errors
wxLogNull noLog;
// do we have it?
HMODULE hModuleComCtl32 = ::GetModuleHandle(wxT("COMCTL32"));
BOOL bFreeComCtl32 = FALSE ;
if(!hModuleComCtl32)
{
hModuleComCtl32 = ::LoadLibrary(wxT("COMCTL32.DLL")) ;
if(hModuleComCtl32)
{
bFreeComCtl32 = TRUE ;
}
}
wxDynamicLibrary dllComCtl32(_T("comctl32.dll"), wxDL_VERBATIM);
// if so, then we can check for the version
if ( hModuleComCtl32 )
if ( dllComCtl32.IsLoaded() )
{
// try to use DllGetVersion() if available in _headers_
WXADLLGETVERSIONPROC pfnDllGetVersion = (WXADLLGETVERSIONPROC)
::GetProcAddress(hModuleComCtl32, "DllGetVersion");
wxDYNLIB_FUNCTION( DLLGETVERSIONPROC, DllGetVersion, dllComCtl32 );
if ( pfnDllGetVersion )
{
WXADLLVERSIONINFO dvi;
DLLVERSIONINFO dvi;
dvi.cbSize = sizeof(dvi);
HRESULT hr = (*pfnDllGetVersion)(&dvi);
@@ -916,53 +904,40 @@ int wxApp::GetComCtl32Version()
dvi.dwMinorVersion;
}
}
// DllGetVersion() unavailable either during compile or
// if DllGetVersion() is 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 )
void *pfn = dllComCtl32.GetSymbol(_T("InitCommonControlsEx"));
if ( !pfn )
{
// not found, must be 4.00
s_verComCtl32 = 400;
}
else
else // 4.70+
{
// many symbols appeared in comctl32 4.71, could use
// any of them except may be DllInstall
theProc = ::GetProcAddress
(
hModuleComCtl32,
"InitializeFlatSB"
);
if ( !theProc )
// many symbols appeared in comctl32 4.71, could use any of
// them except may be DllInstall()
pfn = dllComCtl32.GetSymbol(_T("InitializeFlatSB"));
if ( !pfn )
{
// not found, must be 4.70
s_verComCtl32 = 470;
}
else
{
// found, must be 4.71
// found, must be 4.71 or later
s_verComCtl32 = 471;
}
}
}
}
if(bFreeComCtl32)
{
::FreeLibrary(hModuleComCtl32) ;
}
}
return s_verComCtl32;
#endif
#endif // Microwin/!Microwin
}
// Yield to incoming messages