added wxApp::GetShell32Version() to test for shell32.dll support of balloon tooltips

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50426 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2007-12-02 16:12:19 +00:00
parent 1046cbe168
commit 5e9b921dc6
2 changed files with 113 additions and 57 deletions

View File

@@ -68,6 +68,10 @@ public:
// wasn't found at all // wasn't found at all
static int GetComCtl32Version(); static int GetComCtl32Version();
// the same for shell32.dll: returns 400, 471, 500, 600, ... (4.70 not
// currently detected)
static int GetShell32Version();
// the SW_XXX value to be used for the frames opened by the application // the SW_XXX value to be used for the frames opened by the application
// (currently seems unused which is a bug -- TODO) // (currently seems unused which is a bug -- TODO)
static int m_nCmdShow; static int m_nCmdShow;

View File

@@ -602,15 +602,42 @@ void wxApp::OnQueryEndSession(wxCloseEvent& event)
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// miscellaneous // system DLL versions
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
#if wxUSE_DYNLIB_CLASS
namespace
{
// helper function: retrieve the DLL version by using DllGetVersion(), returns
// 0 if the DLL doesn't export such function
int CallDllGetVersion(wxDynamicLibrary& dll)
{
// now check if the function is available during run-time
wxDYNLIB_FUNCTION( DLLGETVERSIONPROC, DllGetVersion, dll );
if ( !pfnDllGetVersion )
return 0;
DLLVERSIONINFO dvi;
dvi.cbSize = sizeof(dvi);
HRESULT hr = (*pfnDllGetVersion)(&dvi);
if ( FAILED(hr) )
{
wxLogApiError(_T("DllGetVersion"), hr);
return 0;
}
return 100*dvi.dwMajorVersion + dvi.dwMinorVersion;
}
} // anonymous namespace
/* static */ /* static */
int wxApp::GetComCtl32Version() int wxApp::GetComCtl32Version()
{ {
#if defined(__WXMICROWIN__) || defined(__WXWINCE__)
return 0;
#else
// cache the result // cache the result
// //
// NB: this is MT-ok as in the worst case we'd compute s_verComCtl32 twice, // NB: this is MT-ok as in the worst case we'd compute s_verComCtl32 twice,
@@ -619,78 +646,103 @@ int wxApp::GetComCtl32Version()
if ( s_verComCtl32 == -1 ) if ( s_verComCtl32 == -1 )
{ {
// initally assume no comctl32.dll at all
s_verComCtl32 = 0;
// we're prepared to handle the errors // we're prepared to handle the errors
wxLogNull noLog; wxLogNull noLog;
#if wxUSE_DYNLIB_CLASS // the DLL should really be available
// do we have it?
wxDynamicLibrary dllComCtl32(_T("comctl32.dll"), wxDL_VERBATIM); wxDynamicLibrary dllComCtl32(_T("comctl32.dll"), wxDL_VERBATIM);
if ( !dllComCtl32.IsLoaded() )
// if so, then we can check for the version
if ( dllComCtl32.IsLoaded() )
{ {
// now check if the function is available during run-time s_verComCtl32 = 0;
wxDYNLIB_FUNCTION( DLLGETVERSIONPROC, DllGetVersion, dllComCtl32 ); return 0;
if ( pfnDllGetVersion ) }
{
DLLVERSIONINFO dvi;
dvi.cbSize = sizeof(dvi);
HRESULT hr = (*pfnDllGetVersion)(&dvi); // try DllGetVersion() for recent DLLs
if ( FAILED(hr) ) s_verComCtl32 = CallDllGetVersion(dllComCtl32);
// 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;
}
else // 4.70+
{
// many symbols appeared in comctl32 4.71, could use any of
// them except may be DllInstall()
pfn = dllComCtl32.GetSymbol(_T("InitializeFlatSB"));
if ( !pfn )
{ {
wxLogApiError(_T("DllGetVersion"), hr); // not found, must be 4.70
s_verComCtl32 = 470;
} }
else else
{ {
// this is incompatible with _WIN32_IE values, but // found, must be 4.71 or later
// compatible with the other values returned by s_verComCtl32 = 471;
// 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;
}
else // 4.70+
{
// 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 or later
s_verComCtl32 = 471;
}
} }
} }
} }
#endif
} }
return s_verComCtl32; return s_verComCtl32;
#endif // Microwin/!Microwin
} }
/* static */
int wxApp::GetShell32Version()
{
static int s_verShell32 = -1;
if ( s_verShell32 == -1 )
{
// we're prepared to handle the errors
wxLogNull noLog;
wxDynamicLibrary dllShell32(_T("shell32.dll"), wxDL_VERBATIM);
if ( dllShell32.IsLoaded() )
{
s_verShell32 = CallDllGetVersion(dllShell32);
if ( !s_verShell32 )
{
// there doesn't seem to be any way to distinguish between 4.00
// and 4.70 (starting from 4.71 we have DllGetVersion()) so
// just assume it is 4.0
s_verShell32 = 400;
}
}
else // failed load the DLL?
{
s_verShell32 = 0;
}
}
return s_verShell32;
}
#else // !wxUSE_DYNLIB_CLASS
/* static */
int wxApp::GetComCtl32Version()
{
return 0;
}
/* static */
int wxApp::GetShell32Version()
{
return 0;
}
#endif // wxUSE_DYNLIB_CLASS/!wxUSE_DYNLIB_CLASS
// ----------------------------------------------------------------------------
// Yield to incoming messages // Yield to incoming messages
// ----------------------------------------------------------------------------
bool wxApp::Yield(bool onlyIfNeeded) bool wxApp::Yield(bool onlyIfNeeded)
{ {