Improve COM error handling in the Windows platform plugin.

Add error strings, print warning if OleInitialize() fails.

Task-number: QTBUG-38398
Change-Id: I37f6b7003fd1cf524ce69d6843891943402b27a1
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
bb10
Friedemann Kleint 2014-04-24 13:09:01 +02:00 committed by The Qt Project
parent 61ce16d25c
commit 817fe67839
1 changed files with 51 additions and 19 deletions

View File

@ -1,7 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2013 Samuel Gaist <samuel.gaist@edeltech.ch>
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the plugins of the Qt Toolkit.
@ -76,6 +76,9 @@
#include <stdlib.h>
#include <stdio.h>
#include <windowsx.h>
#ifndef Q_OS_WINCE
# include <comdef.h>
#endif
QT_BEGIN_NAMESPACE
@ -309,6 +312,10 @@ QWindowsContextPrivate::QWindowsContextPrivate()
m_systemInfo |= QWindowsContext::SI_RTL_Extensions;
m_keyMapper.setUseRTLExtensions(true);
}
if (FAILED(m_oleInitializeResult)) {
qWarning() << "QWindowsContext: OleInitialize() failed: "
<< QWindowsContext::comErrorString(m_oleInitializeResult);
}
}
QWindowsContext::QWindowsContext() :
@ -691,45 +698,70 @@ HWND QWindowsContext::createDummyWindow(const QString &classNameIn,
QByteArray QWindowsContext::comErrorString(HRESULT hr)
{
QByteArray result = QByteArrayLiteral("COM error 0x")
+ QByteArray::number(quintptr(hr), 16) + ' ';
switch (hr) {
case S_OK:
return QByteArrayLiteral("S_OK");
result += QByteArrayLiteral("S_OK");
break;
case S_FALSE:
return QByteArrayLiteral("S_FALSE");
result += QByteArrayLiteral("S_FALSE");
break;
case E_UNEXPECTED:
return QByteArrayLiteral("E_UNEXPECTED");
result += QByteArrayLiteral("E_UNEXPECTED");
break;
case CO_E_ALREADYINITIALIZED:
return QByteArrayLiteral("CO_E_ALREADYINITIALIZED");
result += QByteArrayLiteral("CO_E_ALREADYINITIALIZED");
break;
case CO_E_NOTINITIALIZED:
return QByteArrayLiteral("CO_E_NOTINITIALIZED");
result += QByteArrayLiteral("CO_E_NOTINITIALIZED");
break;
case RPC_E_CHANGED_MODE:
return QByteArrayLiteral("RPC_E_CHANGED_MODE");
result += QByteArrayLiteral("RPC_E_CHANGED_MODE");
break;
case OLE_E_WRONGCOMPOBJ:
return QByteArrayLiteral("OLE_E_WRONGCOMPOBJ");
result += QByteArrayLiteral("OLE_E_WRONGCOMPOBJ");
break;
case CO_E_NOT_SUPPORTED:
return QByteArrayLiteral("CO_E_NOT_SUPPORTED");
result += QByteArrayLiteral("CO_E_NOT_SUPPORTED");
break;
case E_NOTIMPL:
return QByteArrayLiteral("E_NOTIMPL");
result += QByteArrayLiteral("E_NOTIMPL");
break;
case E_INVALIDARG:
return QByteArrayLiteral("E_INVALIDARG");
result += QByteArrayLiteral("E_INVALIDARG");
break;
case E_NOINTERFACE:
return QByteArrayLiteral("E_NOINTERFACE");
result += QByteArrayLiteral("E_NOINTERFACE");
break;
case E_POINTER:
return QByteArrayLiteral("E_POINTER");
result += QByteArrayLiteral("E_POINTER");
break;
case E_HANDLE:
return QByteArrayLiteral("E_HANDLE");
result += QByteArrayLiteral("E_HANDLE");
break;
case E_ABORT:
return QByteArrayLiteral("E_ABORT");
result += QByteArrayLiteral("E_ABORT");
break;
case E_FAIL:
return QByteArrayLiteral("E_FAIL");
result += QByteArrayLiteral("E_FAIL");
break;
case RPC_E_WRONG_THREAD:
return QByteArrayLiteral("RPC_E_WRONG_THREAD");
result += QByteArrayLiteral("RPC_E_WRONG_THREAD");
break;
case RPC_E_THREAD_NOT_INIT:
return QByteArrayLiteral("RPC_E_THREAD_NOT_INIT");
result += QByteArrayLiteral("RPC_E_THREAD_NOT_INIT");
break;
default:
break;
}
return "Unknown error 0x" + QByteArray::number(quint64(hr), 16);
#ifndef Q_OS_WINCE
_com_error error(hr);
result += QByteArrayLiteral(" (");
result += QString::fromWCharArray(error.ErrorMessage()).toLocal8Bit();
result += ')';
#endif // !Q_OS_WINCE
return result;
}
/*!