c - Windows 上 C/GTK 应用程序的简单更新机制

标签 c windows gtk auto-update

我正在开发 C/GTK 应用程序。我很快就会发布一个新版本,我认为在其中包含一些更新机制会很有用,这样应用程序就能够 self 更新。

我真的只需要简单的东西;如果它只在 Windows 上运行就足够了,因为在 Linux 上,该应用程序位于存储库中,因此用户可以轻松更新它。

所以我想问一下,是否有一些简单易行的方法来做到这一点(比如一些小型图书馆),或者我必须自己实现吗?

谢谢。

附言

我真的想要一些非常简单的东西,例如,假设应用程序将从包含最新版本号的服务器下载网页。如果应用程序版本号!=服务器版本号,它会获取一个 setup.exe,以某种方式检查其真实性并运行它。

最佳答案

这可能不是问题的完整答案,但如果您要自己实现,您可能需要考虑以下几点:

对于“检查更新”部分,无需实际下载,您可以从在线位置下载包含最新版本字符串(例如 1.24)的文本文件。这段代码片段应该适用于 Windows 版本(虽然我还没有测试过):

#include <wininet.h>

_Bool CheckForUpdate() {
    DWORD flags = 0; // Not really used. DWORD == unsigned long

    if (!InternetGetConnectedState(&flags, 0)) {
        // The user is not connected to the Internet. Finished?
    }
    
    // Open the connection (HINTERNET == void *):
    HINTERNET connection = InternetOpen("User Agent", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if (http == NULL) {
        // Error.
        ...
    }
    
    HINTERNET updateFile = InternetOpenUrl(connection, "URL", NULL, FLAGS, 0);
    if (updateFile == NULL) {
        // Something went wrong.
        ...
        InternetcloseHandle(connection); // Close the handle.
        ...
    }
    
    // Reached here, we have the connection up, reading the file:
    char latestVersion[10] = {0};
    DWORD bytesRead = 0;
    if (InternetReadFile(updateFile, latestVersion, sizeof(latestVersion), &bytesRead) == FALSE) {
        // Error.
        ...
        InternetCloseHandle(updateFile);
        InternetCloseHandle(connection);
        ...
    }
    
    // Internet stuff is finished, so the handles can be closed now:
    InternetCloseHandle(updateFile);
    InternetCloseHandle(connection);
    
    // Check if there's a new version available:
    if (strcmp(latestVersion, CURRENT_VERSION) > 0) {
        // An update is available.
        return 1;
    } else {
        // No new updates available.
        return 0;
    }
}

有指向我在答案末尾使用的 Wininet 函数的文档的链接,您可以在其中查看每个参数的作用。

调用InternetOpen()时例如,用户代理字符串可能是您的应用程序名称。我写了INTERNET_OPEN_TYPE_DIRECT由于这是最常见的设置,因此未指定代理配置。

InternetOpenUrl()调用第二个参数应该是文本文件的 URL,格式为 NULL终止的字符串。对于 FLAGS该调用中的参数检查您拥有的不同文档的在线文档(查看帖子底部的链接)。例如,可能的标志组合如下:

INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_AUTH | INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_NO_UI

strcmp()调用应该也适用于版本之间的字母,因此按照上面的示例“1.24c”应该是比“1.24”或“1.24a”更新的版本。

如果您有多个发布路径(例如 beta 版本),您可以在文本文件中使用多个字段或有多个文件。如果您不想将不稳定版本推送给所有用户,而只推送那些愿意使用此类构建的用户,这可能很有用。

如果读取文件时没有错误,您还可以使用 HttpQueryInfo() 添加检查以查看 HTTP 状态代码是否为 200(正常)功能与 HTTP_QUERY_STATUS_CODE旗帜。

无论如何,所有这一切只是为了获得新版本的认可,您可以通过消息通知您的用户或使用类似的方案来下载新的安装应用程序。对于身份验证阶段,您可以将安装文件的校验和添加到版本文件中,并在文件下载后进行计算。

Wininet API 在线文档链接:

希望对您有所帮助。

关于c - Windows 上 C/GTK 应用程序的简单更新机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4058950/

相关文章:

windows - NUMA-本地内存

c# - 类似于 Javascript 的 WinForms 模态窗口

perl - 在 Perl/Gtk 中显示 CP437 ('extended ascii' )

c - 如何使用GTK C库?

C 为什么 scanf 返回错误输出

c++ - 是否可以将 PEX 与 C 一起使用?

c - 开发非 x86 操作系统

c - 打印#define 常量

mysql - 可以 select ... into outfile 而不是将其保存到文件中,而是将其保存在 blob 中

c - Webkit GTK : Exposing HTTP headers