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:
@@ -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;
|
||||||
|
166
src/msw/app.cpp
166
src/msw/app.cpp
@@ -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)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user