我正在构建一个 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())
足够了。