用quazip(Qt)无法提取exe或dll文件

时间:2014-04-03 13:47:30

标签: c++ windows qt5 quazip

我正在构建一个qt框架来下载和安装应用程序更新(例如obj-c的sparkle)。下载工作,下载的zip文件是有效的,我可以手动提取内容,但当我让我的框架通过quazip解压缩内容时,文件(dll和exe)包含这个,只有这个字符串:“MZ”和一个错误编码的特殊字符(Windows上的某种方格和mac上的“ê”),正好是3个字节。当我在zip文件中包含一个文本文件(或xml)时,它将被正确解压缩,手动和quazip,所以我假设库已正确编译。我的错误在哪里?

我认为这可以成为解决方案的一部分http://en.wikipedia.org/wiki/DOS_MZ_executable

以下是我安装更新的方法:

QuaZip archiveWrapper(filename); // The downloaded zip file

if (archiveWrapper.open(QuaZip::mdUnzip)) {
    QuaZipFile archive(&archiveWrapper);

    qDebug() << "Extracting files" << archiveWrapper.getFileNameList();

    for (bool more = archiveWrapper.goToFirstFile(); more; more = archiveWrapper.goToNextFile()) {
        QString filePath = archiveWrapper.getCurrentFileName();
        QString destinationPath = QDir::cleanPath(QDir::currentPath() + QDir::separator() + filePath);
        QString destinationBackup = destinationPath + "_backup";

        qDebug() << "Extract" << filePath << "to" << destinationPath;

        QuaZipFile zip(archive.getZipName(), filePath);
        zip.open(QIODevice::ReadOnly);
        QByteArray data = zip.readAll();
        zip.close();

        QFile oldFile(destinationPath);
        if (oldFile.exists()) {
            qDebug() << "Rename" << destinationPath << "to" << destinationBackup;

            if (!oldFile.rename(destinationBackup)) {
                qWarning("Could not rename %s to %s!", destinationPath.toUtf8().constData(), destinationBackup.toUtf8().constData());
            }
        }

        QFile destination(destinationPath);
        destination.open(QIODevice::WriteOnly);
        destination.write(data.data());
        destination.close();

        if (oldFile.exists()) {
            qDebug() << "Deleting backup of" << destinationPath;

            if (!oldFile.remove()) {
                qWarning("Could not delete %s!", destinationPath.toUtf8().constData());
            }
        }
    }

    if (archive.getZipError() == UNZ_OK) {
        qDebug() << "All files extracted successfully";
        qDebug() << "Restarting application...";

        archiveWrapper.close();

        qApp->quit();
        QProcess::startDetached(qApp->arguments()[0], qApp->arguments());
    } else {
        qWarning("Error while extracting files (Error %d)", archive.getZipError());
        archiveWrapper.close();
    }
} else {
    qWarning("Could not open archive to extract contents");
}

修改

我发现数据(QByteArray)具有预期的大小,所以我认为问题是QFile没有按照应有的方式将QByteArray的内容写入exe / dll文件中?

编辑2:

我发现了一个错误,即要写的文件大小:

destination.write(data.data(), data.size());

而不是

destination.write(data.data());

但是,exe仍然没有图标或可执行文件(但文件大小正确)。在短时间内打开和关闭dos窗口。有一个防病毒软件正在运行,但没有警报(因为这是一个企业笔记本,我无法关闭它,无论是否有防病毒软件运行,更新框架也应该运行。)

编辑3:

虽然我认为编写exe文件很复杂,但它是为了测试目的而“实现”的愚蠢错误的混合。所以简单

QFile destination(destinationPath);
destination.open(QIODevice::WriteOnly);
destination.write(data.data(), data.size())

就足够了。

0 个答案:

没有答案