From 4cde7b2ed657e5cc2f5f7c071f4ff0a7dd20d56b Mon Sep 17 00:00:00 2001 From: kh1 Date: Mon, 18 Mar 2013 13:17:58 +0100 Subject: Fix missing wizard icon on a windows static build. Q_IMPORT_PLUGIN() macros are needed in application code only for Qt4, in Qt5 those are automatically generated by qmake. Change-Id: Ic75795be402592a0595bb3aa084d0b7ee9a9f8c5 Reviewed-by: Niels Weber Reviewed-by: Karsten Heimrich Reviewed-by: Tim Jenssen --- installerfw.pri | 2 ++ src/libs/installer/fileutils.cpp | 31 +++++++++++++++++-------------- src/libs/installer/init.cpp | 15 ++++++++++++--- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/installerfw.pri b/installerfw.pri index 0dcc1b5e4..ec7b88fb4 100644 --- a/installerfw.pri +++ b/installerfw.pri @@ -82,12 +82,14 @@ macx:LIBS += -framework Carbon -framework Security isEqual(QT_MAJOR_VERSION, 4) { CONFIG += uitools CONFIG(static, static|shared) { + QTPLUGIN += qico DEFINES += QT_STATIC QT += script network xml } } else { QT += uitools core-private CONFIG(static, static|shared) { + QTPLUGIN += qico QT += concurrent network script xml } } diff --git a/src/libs/installer/fileutils.cpp b/src/libs/installer/fileutils.cpp index e2a995dba..315a34f5d 100644 --- a/src/libs/installer/fileutils.cpp +++ b/src/libs/installer/fileutils.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include @@ -557,20 +558,21 @@ typedef struct { void QInstaller::setApplicationIcon(const QString &application, const QString &icon) { - wchar_t* const path = new wchar_t[application.length() + 1]; - QDir::toNativeSeparators(application).toWCharArray(path); - path[application.length()] = 0; - - HANDLE updateRes = BeginUpdateResource(path, false); - delete[] path; - QFile iconFile(icon); - if (!iconFile.open(QIODevice::ReadOnly)) + if (!iconFile.open(QIODevice::ReadOnly)) { + qWarning() << QString::fromLatin1("Could not use '%1' as application icon: %2.") + .arg(icon, iconFile.errorString()); return; + } - QByteArray temp = iconFile.readAll(); + if (QImageReader::imageFormat(icon) != "ico") { + qWarning() << QString::fromLatin1("Could not use '%1' as application icon, unsupported format %2.") + .arg(icon, QLatin1String(QImageReader::imageFormat(icon))); + return; + } - ICONDIR* ig = reinterpret_cast< ICONDIR* >(temp.data()); + QByteArray temp = iconFile.readAll(); + ICONDIR* ig = reinterpret_cast (temp.data()); DWORD newSize = sizeof(GRPICONDIR) + sizeof(GRPICONDIRENTRY) * (ig->idCount - 1); GRPICONDIR* newDir = reinterpret_cast< GRPICONDIR* >(new char[newSize]); @@ -578,6 +580,7 @@ void QInstaller::setApplicationIcon(const QString &application, const QString &i newDir->idType = ig->idType; newDir->idCount = ig->idCount; + HANDLE updateRes = BeginUpdateResourceW((wchar_t*)QDir::toNativeSeparators(application).utf16(), false); for (int i = 0; i < ig->idCount; ++i) { char* temp1 = temp.data() + ig->idEntries[i].dwImageOffset; DWORD size1 = ig->idEntries[i].dwBytesInRes; @@ -591,16 +594,16 @@ void QInstaller::setApplicationIcon(const QString &application, const QString &i newDir->idEntries[i].dwBytesInRes = ig->idEntries[i].dwBytesInRes; newDir->idEntries[i].nID = i + 1; - UpdateResource(updateRes, RT_ICON, MAKEINTRESOURCE(i + 1), + UpdateResourceW(updateRes, RT_ICON, MAKEINTRESOURCE(i + 1), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), temp1, size1); } - UpdateResource(updateRes, RT_GROUP_ICON, L"IDI_ICON1", MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), newDir - , newSize); + UpdateResourceW(updateRes, RT_GROUP_ICON, L"IDI_ICON1", MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), + newDir, newSize); delete [] newDir; - EndUpdateResource(updateRes, false); + EndUpdateResourceW(updateRes, false); } #endif diff --git a/src/libs/installer/init.cpp b/src/libs/installer/init.cpp index e0c51a2f3..40c396ab4 100644 --- a/src/libs/installer/init.cpp +++ b/src/libs/installer/init.cpp @@ -85,6 +85,8 @@ #include +#include + #include namespace NArchive { @@ -151,10 +153,17 @@ static void initArchives() CrcGenerateTable(); } +#if defined(QT_STATIC) static void initResources() { Q_INIT_RESOURCE(patch_file_lists); + Q_INIT_RESOURCE(installer); +# if QT_VERSION < 0x050000 + Q_IMPORT_PLUGIN(qico) + Q_UNUSED(qt_plugin_instance_qico()); +# endif } +#endif static QByteArray trimAndPrepend(QtMsgType type, const QByteArray &msg) { @@ -220,7 +229,10 @@ void messageHandler(QtMsgType type, const QMessageLogContext &context, const QSt void QInstaller::init() { +#if defined(QT_STATIC) + ::initArchives(); ::initResources(); +#endif UpdateOperationFactory &factory = UpdateOperationFactory::instance(); factory.registerUpdateOperation(QLatin1String("CreateShortcut")); @@ -262,9 +274,6 @@ void QInstaller::init() factory.registerUpdateOperation(QLatin1String("ReplaceInstallNames")); #endif // Q_OS_MAC - // load 7z stuff, if we're a static lib - ::initArchives(); - // qDebug -> verbose() #if QT_VERSION < 0x050000 qInstallMsgHandler(messageHandler); -- cgit v1.2.3