From 043529c9dc609f3dc4bc6c79b7bc4d33ca3a3ba3 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 19 May 2014 14:13:23 +0200 Subject: Windows QPA: Remove dependency on swprintf_s() pulled in via _com_error::ErrorMessage(). Task-number: QTBUG-35617 Change-Id: I0ad926ac564612ebd0eb38f16b3e69cbcd48e62f Reviewed-by: Joerg Bornemann --- src/plugins/platforms/windows/qwindowscontext.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'src/plugins/platforms/windows/qwindowscontext.cpp') 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; -- cgit v1.2.3