summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.cpp23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp
index 18e62b26d4..f2f285f0f6 100644
--- a/src/plugins/platforms/windows/qwindowscontext.cpp
+++ b/src/plugins/platforms/windows/qwindowscontext.cpp
@@ -692,6 +692,27 @@ HWND QWindowsContext::createDummyWindow(const QString &classNameIn,
HWND_MESSAGE, NULL, (HINSTANCE)GetModuleHandle(0), NULL);
}
+#ifndef Q_OS_WINCE
+// Re-engineered from the inline function _com_error::ErrorMessage().
+// We cannot use it directly since it uses swprintf_s(), which is not
+// present in the MSVCRT.DLL found on Windows XP (QTBUG-35617).
+static inline QString errorMessageFromComError(const _com_error &comError)
+{
+ TCHAR *message = Q_NULLPTR;
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL, comError.Error(), MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
+ message, 0, NULL);
+ if (message) {
+ const QString result = QString::fromWCharArray(message).trimmed();
+ LocalFree((HLOCAL)message);
+ return result;
+ }
+ if (const WORD wCode = comError.WCode())
+ return QStringLiteral("IDispatch error #") + QString::number(wCode);
+ return QStringLiteral("Unknown error 0x0") + QString::number(comError.Error(), 16);
+}
+#endif // !Q_OS_WINCE
+
/*!
\brief Common COM error strings.
*/
@@ -758,7 +779,7 @@ QByteArray QWindowsContext::comErrorString(HRESULT hr)
#ifndef Q_OS_WINCE
_com_error error(hr);
result += QByteArrayLiteral(" (");
- result += QString::fromWCharArray(error.ErrorMessage()).toLocal8Bit();
+ result += errorMessageFromComError(error);
result += ')';
#endif // !Q_OS_WINCE
return result;