1

アプリケーションの更新をダウンロードしてインストールするための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:

書き込むファイル サイズのエラーが 1 つ見つかりました。

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())

十分なものです。

4

0 に答える 0