- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在开发 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/
我正在尝试使用 GTK 构建一个 hello world,其中包括以下行: #include 如你所料。 提供的 Makefile 包含以下行: GTK_INCLUDE = -I/usr/local
我对 GTK 术语感到困惑。根据Wikipedia ,似乎有与 GTK+ 的绑定(bind),称为 GTK (GtkAda) 和 GTK2 (gtk2hs、Gtk2-Perl)。 有人可以帮我解决这个
我在 Gtk.Fixed 中有一个 Gtk.TextView,我设置了它的宽度和高度以及换行模式。 我的问题是,当用户插入的文本多于设置大小时,我需要避免 TextView 扩展。在那种情况下,我只需
我考虑使用带有 Broadway 后端的 GTK+ 来开发设备控制应用程序。 设备的功能类似于宽带调制解调器/路由器(我特意选择了所有人都熟悉的示例 :-))。 设备应通过网络浏览器远程控制。 我担心
我想更改 Windows 的默认 GTK 主题。我知道该怎么做:通过修改 settings.ini 文件,或者像这样: settings = gtk_settings_get_default(); g
在 GTK+ 3 中将多个键盘快捷键绑定(bind)到一个操作的最佳方法是什么? 这几天我一直在寻找这个问题的答案,但一无所获。函数 gtk_accelerator_parse 不支持逗号分隔的快捷方
虽然 Gtk.table 已被弃用,但我用它获得了更好的结果,而不是推荐的 Gtk.Grid。 这可能是我的错误,但我找不到问题。 我的目标是创建一个 Gtk 窗口,顶部有一个笔记本,下面有两个按钮。
虽然 Gtk.table 已被弃用,但我用它获得了更好的结果,而不是推荐的 Gtk.Grid。 这可能是我的错误,但我找不到问题。 我的目标是创建一个 Gtk 窗口,顶部有一个笔记本,下面有两个按钮。
是否可以在辅助线程而不是主线程中运行 GTK 的主循环? 最佳答案 是的,您可以在任何线程中使用主循环,但您只能从创建它的线程访问它。 但是,这不是一件常见的事情,并且可能有更好的方法来做您想做的任何
我从一个空表开始(只有一列的列表存储) 我希望用户能够导入 CSV 文件并显示内容。导入文件有效,确实显示了 CSV 数据,但保留了原始列(标题为“无数据”)。我该如何摆脱它? 我已经尝试删除 Tre
我正在尝试找出是否可以使用适用于 Windows 的 Python 3.2.2 或更高版本编写基于 Python 的 Windows 桌面小部件。上述项目完全令人困惑。他们中的任何一个支持我正在寻找的
我正在构建一个使用 kivy 的 cefpython 小部件的 Kivy 应用程序。 在执行我的程序时,每当我将文本输入小部件添加到 View 中时,我的应用程序都会崩溃并出现以下错误: Gtk-ER
Vala 中的源代码: using GLib; using Gtk; class MainWindow : Window { public static int main (string[] a
为什么 set_size_request(800,600) 在 DrawingArea 小部件上调用(也用 Gtk.Button 测试)导致大小为 958 x 791 px 的窗口,而在 Window
当我手动构建项目时,它会正确构建: gcc main.c -o midget `pkg-config --cflags --libs gtk+-3.0` 当我尝试使用 Makefile 时,它失败
如果有人对 the following function 有任何经验,我很感兴趣gtk.Window/gtk.Widget 的 shape_combine_mask(shape_mask, offs
如果我正在编写一个想要通过使用颜色来传达一些信息的应用程序,我该如何更改给定小部件的背景色和前景色?如果可能的话,我想知道如何在空地中做到这一点,以及以编程方式(计算颜色)。 我也想知道如何对复杂的小
假设有问题的小部件是一个包含一个标签和两个按钮的 VBox。 此外,假设所需的旋转角度为 90°。 如何旋转它?我认为默认情况下这是不可能的,但我认为这是可能的。 但是,我不知道如何开始。我要编写自定
我想知道当 Gtk.Window 完全显示时发出哪个信号,完全显示是指显示窗口本身及其小部件。 我尝试了几个信号: 展示 意识到 可见性通知事件 设置焦点 但它们都无法正常工作。 我在网上找到的唯一有
GTK+ Button 小部件具有控制焦点获取的 focus_on_click 属性。但是我使用的 MenuToolButton 没有这样的属性。我不想关注点击。 如何摆脱它?谢谢! 最佳答案 如果您
我是一名优秀的程序员,十分优秀!