自动更新程序示例

Posted

技术标签:

【中文标题】自动更新程序示例【英文标题】:Auto Updater Examples 【发布时间】:2011-12-17 09:18:56 【问题描述】:

我一直在寻找如何在 google 上进行自动更新,但没有成功。

我打算创建一个更新程序(另一个由 QProcess 调用的 exe,虽然是主要的 exe),但我有一些问题:

如何使 QProcess 保持静音? 如果有新版本,我如何在启动进程的窗口上显示通知(我的意思是我已经在 Game.exe 中创建了进程,我想从 Updater.exe 向 Game.exe 发送通知有一个新版本可用。)

感谢您的回答。

【问题讨论】:

你需要进程间通信,Qt 有一个 D-Bus 类的集合很适合这个。 【参考方案1】:

首先,除了QThread 之外,我从来没有遇到过需要创建任何东西来处理我的更新需求。 QProcess 将很有帮助,一旦用户更新,您想在用户继续使用主程序时下载、安装和重新启动程序。 (但这都可以通过shell脚本、python脚本,甚至BAT文件来实现)

当您使用QProcess 时,您将不得不依赖信号readyReadStandardError()readyReadStandardOutput()。然后,您的进程正在调用的应用程序应将其输出发送到 stderrstdoutUpdater.exe 应该写入这些文件中的任何一个。

我想你的更新程序会使用QNetworkAccessManager::finished(QNetworkReply *reply)。当这个槽被调用时,请做一些比这更好的事情:

void Updater::replyFinished(QNetworkReply *reply)
    QString r(reply->readAll());
    if(r.contains(SERVER_REPLY_UPDATE_AVAILABLE))
        qDebug() << "yes";
    else
        qDebug() << "no";
        QApplication::quit();
    
  

如果 Updater.exe 将成为一个完整的 GUI 应用程序,请不要调用 show() 方法,除非它需要并且它应该在后台运行。我更喜欢脚本,但你了解我。

然后您的 Game.exe 将设置一个QProcess。您可以在QProcess::start() 函数中将参数传递给进程。

有助于指导您的更新过程的好论据是:

Game.exe 版本号 “check_for_updates” “忽略更新” “下载更新”

最后,在 Game.exe 中:

...
connect(process,SIGNAL(readyReadStandardError()),this,SLOT(readProcessReply()));
...

void Game::readProcessReply()
    QString r(process->readAllStandardError());
    if(r.contains("yes"))
        //show your dialog here
    else
        //do nothing
    

【讨论】:

以上是关于自动更新程序示例的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序发布新版本时自动提示用户更新

WPF XAML 绑定中的自动字段更新 - 简单示例不起作用

如何在亚马逊中实现 IAP 订阅的自动更新开/关功能 - kindle android 应用程序

如何在自动缩放的弹性 beantalk 实例中更新文件

Delphi 求高手帮忙写自动更新程序

DELPHI有自动更新程序怎么破求教