From 9fc6c21c03b91b398ae8d02fde35b8c2a996dfcf Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 1 Aug 2003 23:13:19 +0000 Subject: [PATCH] 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 --- src/msw/app.cpp | 141 ++++++++++++++++++++---------------------------- 1 file changed, 58 insertions(+), 83 deletions(-) diff --git a/src/msw/app.cpp b/src/msw/app.cpp index 26e39644e4..91b0ee77f4 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -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 @@ -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,100 +864,80 @@ 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"); - if ( pfnDllGetVersion ) + wxDYNLIB_FUNCTION( DLLGETVERSIONPROC, DllGetVersion, dllComCtl32 ); + if ( pfnDllGetVersion ) + { + DLLVERSIONINFO dvi; + dvi.cbSize = sizeof(dvi); + + HRESULT hr = (*pfnDllGetVersion)(&dvi); + if ( FAILED(hr) ) { - WXADLLVERSIONINFO dvi; - dvi.cbSize = sizeof(dvi); + 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; + } + } - 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; - } + // 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 + void *pfn = dllComCtl32.GetSymbol(_T("InitCommonControlsEx")); + if ( !pfn ) + { + // not found, must be 4.00 + s_verComCtl32 = 400; } - // DllGetVersion() unavailable either during compile or - // run-time, try to guess the version otherwise - if ( !s_verComCtl32 ) + else // 4.70+ { - // InitCommonControlsEx is unique to 4.70 and later - FARPROC theProc = ::GetProcAddress - ( - hModuleComCtl32, - "InitCommonControlsEx" - ); - - 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.00 - s_verComCtl32 = 400; + // not found, must be 4.70 + s_verComCtl32 = 470; } 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; - } + // 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 -- 2.45.2