Не могу извлечь exe или dll файлы с помощью quazip (Qt)

Я строю фреймворк 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())

достаточно.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]