Я строю фреймворк qt для загрузки и установки обновлений приложений (например, искриться для obj-c). Загрузка работает, загруженный zip-файл действителен, и я могу извлечь содержимое вручную, но когда я позволяю моей структуре распакуйте содержимое через quazip файлы (DLL и EXE) содержит эту и только эту строку: «MZ» и специальный символ, который неправильно закодирован (какой-то квадрат на окнах и «ê» на mac), то есть ровно 3 байта. Когда я включаю текстовый файл (или xml) в zip-файл, он будет распакован правильно, вручную и с помощью 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());
но все же, исполняемый файл не имеет значок или является исполняемым (но с правильным размером файла). В течение короткого времени окно DOS открывается и закрывается. Антивирусное программное обеспечение запущено, но оповещения нет (и поскольку это корпоративный ноутбук, я не могу его выключить, и среда обновления также должна работать независимо от того, работает антивирусное программное обеспечение или нет).
Изменить 3:
Хотя я думал, что писать exe-файлы сложно, это была смесь глупых ошибок, которые я «внедрил» в целях тестирования. Так просто
QFile destination(destinationPath);
destination.open(QIODevice::WriteOnly);
destination.write(data.data(), data.size())
достаточно.
Задача ещё не решена.
Других решений пока нет …