Windows QPA: Remove dependency on swprintf_s() pulled in via _com_error::ErrorMessage().

Task-number: QTBUG-35617
Change-Id: I0ad926ac564612ebd0eb38f16b3e69cbcd48e62f
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
This commit is contained in:
Friedemann Kleint 2014-05-19 14:13:23 +02:00 committed by The Qt Project
parent ac10baa2a0
commit 043529c9dc

View File

@ -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;