Fix usage of API functions on Windows 1607 (Build 14393)
* Windows Server 2016, Windows 10 LTSB 2016 and Windows 10 version 1607: SetThreadDescription is only available by Run Time Dynamic Linking in KernelBase.dll. See [1]. * According to [2] UiaRaiseNotificationEvent should be available on Windows Server 2016 but in fact it is not. [1] https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setthreaddescription [2] https://learn.microsoft.com/de-de/windows/win32/api/uiautomationcoreapi/nf-uiautomationcoreapi-uiaraisenotificationevent Fixes: QTBUG-134075 Pick-to: 6.9.0 6.8 6.8.3 Change-Id: I3c4c733a4112a72b75f91f017a278dff2454e100 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> (cherry picked from commit a9e251332cbec0f64c9c085349836af7276c55d3) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
3e2fcff478
commit
5ed1dcd1cc
@ -165,7 +165,21 @@ unsigned int __stdcall QT_ENSURE_STACK_ALIGNED_FOR_SSE QThreadPrivate::start(voi
|
|||||||
QString threadName = std::exchange(thr->d_func()->objectName, {});
|
QString threadName = std::exchange(thr->d_func()->objectName, {});
|
||||||
if (Q_LIKELY(threadName.isEmpty()))
|
if (Q_LIKELY(threadName.isEmpty()))
|
||||||
threadName = QString::fromUtf8(thr->metaObject()->className());
|
threadName = QString::fromUtf8(thr->metaObject()->className());
|
||||||
|
#ifndef QT_WIN_SERVER_2016_COMPAT
|
||||||
SetThreadDescription(GetCurrentThread(), reinterpret_cast<const wchar_t *>(threadName.utf16()));
|
SetThreadDescription(GetCurrentThread(), reinterpret_cast<const wchar_t *>(threadName.utf16()));
|
||||||
|
#else
|
||||||
|
HMODULE kernelbase = GetModuleHandleW(L"kernelbase.dll");
|
||||||
|
if (kernelbase != NULL) {
|
||||||
|
typedef HRESULT (WINAPI *DESCFUNC)(HANDLE, PCWSTR);
|
||||||
|
|
||||||
|
DESCFUNC setThreadDescription =
|
||||||
|
(DESCFUNC)GetProcAddress(kernelbase, "SetThreadDescription");
|
||||||
|
if (setThreadDescription != NULL) {
|
||||||
|
setThreadDescription(GetCurrentThread(),
|
||||||
|
reinterpret_cast<const wchar_t *>(threadName.utf16()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
emit thr->started(QThread::QPrivateSignal());
|
emit thr->started(QThread::QPrivateSignal());
|
||||||
QThread::setTerminationEnabled(true);
|
QThread::setTerminationEnabled(true);
|
||||||
|
@ -212,9 +212,23 @@ void QWindowsUiaMainProvider::raiseNotification(QAccessibleAnnouncementEvent *ev
|
|||||||
? NotificationProcessing_ImportantAll
|
? NotificationProcessing_ImportantAll
|
||||||
: NotificationProcessing_All;
|
: NotificationProcessing_All;
|
||||||
QBStr activityId{ QString::fromLatin1("") };
|
QBStr activityId{ QString::fromLatin1("") };
|
||||||
|
#if !defined(Q_CC_MSVC) || !defined(QT_WIN_SERVER_2016_COMPAT)
|
||||||
UiaRaiseNotificationEvent(provider.Get(), NotificationKind_Other, processing, message.bstr(),
|
UiaRaiseNotificationEvent(provider.Get(), NotificationKind_Other, processing, message.bstr(),
|
||||||
activityId.bstr());
|
activityId.bstr());
|
||||||
|
#else
|
||||||
|
HMODULE uiautomationcore = GetModuleHandleW(L"UIAutomationCore.dll");
|
||||||
|
if (uiautomationcore != NULL) {
|
||||||
|
typedef HRESULT (WINAPI *EVENTFUNC)(IRawElementProviderSimple *, NotificationKind,
|
||||||
|
NotificationProcessing, BSTR, BSTR);
|
||||||
|
|
||||||
|
EVENTFUNC uiaRaiseNotificationEvent =
|
||||||
|
(EVENTFUNC)GetProcAddress(uiautomationcore, "UiaRaiseNotificationEvent");
|
||||||
|
if (uiaRaiseNotificationEvent != NULL) {
|
||||||
|
uiaRaiseNotificationEvent(provider.Get(), NotificationKind_Other, processing,
|
||||||
|
message.bstr(), activityId.bstr());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#include "qwindowsuiautomation.h"
|
#include "qwindowsuiautomation.h"
|
||||||
|
|
||||||
#if defined(__MINGW32__) || defined(__MINGW64__)
|
#ifndef Q_CC_MSVC
|
||||||
|
|
||||||
template<typename T, typename... TArg>
|
template<typename T, typename... TArg>
|
||||||
struct winapi_func
|
struct winapi_func
|
||||||
@ -78,6 +78,6 @@ HRESULT WINAPI UiaRaiseNotificationEvent(
|
|||||||
return func.invoke(pProvider, notificationKind, notificationProcessing, displayString, activityId);
|
return func.invoke(pProvider, notificationKind, notificationProcessing, displayString, activityId);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // defined(__MINGW32__) || defined(__MINGW64__)
|
#endif // !Q_CC_MSVC
|
||||||
|
|
||||||
#endif // QT_CONFIG(accessibility)
|
#endif // QT_CONFIG(accessibility)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user