关于arrdiro实现开发软件的更新


关于arrdiro实现开发软件的更新

按下面的教程,文本坐标txt转shp或kml.exe 软件的更新信息如下:

版本信息地址:https://gtjs-9gjbu0mx.maozi.io/ruanjian/wb2shp.txt

软件下载地址:https://gtjs-9gjbu0mx.maozi.io/ruanjian/文本坐标txt转shp或kml.exe

按下面的教程,键盘鼠标自动化2026.exe 软件的更新信息如下:

版本信息地址:https://gtjs-9gjbu0mx.maozi.io/ruanjian/sbjp.txt

软件下载地址:https://gtjs-9gjbu0mx.maozi.io/ruanjian/键盘鼠标自动化2026.exe

按下面的教程,CAD脚本运行集合.exe 软件的更新信息如下:

版本信息地址:https://gtjs-9gjbu0mx.maozi.io/ruanjian/cad.txt

软件下载地址:https://gtjs-9gjbu0mx.maozi.io/ruanjian/CAD脚本运行集合.exe

刚开时的界面

```bash import win.ui; import web.view; import wsock.tcp.simpleHttpServer; /*DSG{{*/ var winform = win.form(text="文本txt转shp或kml"; right=1024; bottom=768) winform.add() /*}}*/ var wb = web.view(winform); // 使用 /res/ 路径,aardio 会自动通过内置 HTTP 服务加载资源 wb.go("/res/index.html") // 在 show 处指定参数 3 (即 _SW_MAXIMIZE) 实现启动即最大化 winform.show(3/*_SW_MAXIMIZE*/); win.loopMessage(); ```

和AI对话,实现软件更新检测

要在 aardio 中实现软件更新检测且不影响主程序的正常使用,最关键的技术点是使用多线程执行网络请求。这样即使网络超时或失败,界面也不会卡死。

你可以将以下代码集成到你的 winform.show() 之前或之后: // 1. 定义当前软件版本号 _APP_VERSION = "1.0.0";

// 2. 启动一个独立线程进行更新检测 thread.invoke( function(winform,_APP_VERSION){ import inet.http; // 导入网络库

    // 创建 HTTP 客户端
    var http = inet.http();

    /*
    从你的服务器获取远程版本号(建议是一个简单的 txt 或 json 文件)
    注意:这里建议设置较短的超时时间,避免长时间等待
    */
    var remoteVersion = http.get("http://您的服务器地址/version.txt");

    // 如果获取失败(没联网或服务器宕机),直接退出线程,不干扰用户
    if(!remoteVersion){
        return; 
    }

    // 去除可能存在的首尾空白字符
    remoteVersion = string.trim(remoteVersion);

    // 3. 比较版本号(这里使用简单的字符串比较,复杂版本建议用 string.split 拆分比较)
    if(remoteVersion > _APP_VERSION){

        // 发现新版本,弹出询问对话框(在线程中直接操作 winform 是线程安全的)
        if( winform.msgboxTest("发现新版本:" + remoteVersion + '\r\n' + "当前版本:" + _APP_VERSION + '\r\n\r\n' + "是否现在前往下载更新?","软件更新") ){

            // 用户点击“确定”,跳转到固定下载地址

            raw.execute("https://您的固定下载地址.com");
        }
    }
},winform,_APP_VERSION // 将窗口对象和版本号传给线程

)

代码要点说明:

  1. 多线程安全:使用 thread.invoke 开启新线程。在线程内部,你可以安全地调用 winform.msgboxTest 或 winform.show()。
  2. 静默失败:代码中通过 if(!remoteVersion) return; 确保了如果网络请求失败(例如用户没联网),程序会直接结束检测线程,用户完全感知不到,从而不会影响软件的正常打开和使用。
  3. 版本文件建议:你的服务器上只需要放一个名为 version.txt 的文件,内容只写版本号数字(例如 1.0.1)即可。
  4. 跳转下载:使用 raw.execute("网址") 会调用系统默认浏览器打开该页面。

修改后的“选中代码”完整示例如下:

```bash import win.ui; import web.view; import wsock.tcp.simpleHttpServer; /*DSG{{*/ var winform = win.form(text="文本txt转shp或kml"; right=1024; bottom=768) winform.add() /*}}*/ // 定义当前版本 _APP_VERSION = "1.0.0"; var wb = web.view(winform); wb.go("/res/index.html"); // 启动更新检测线程 thread.invoke( function(winform,_APP_VERSION){ import inet.http; var http = inet.http(); // 设置较短的连接超时(毫秒),避免弱网环境下等待太久 http.setTimeouts(2000,2000,2000); var remoteVersion = http.get("http://example.com/version.txt"); // 失败则静默退出 if(!remoteVersion) return; remoteVersion = string.trim(remoteVersion); if(remoteVersion > _APP_VERSION){ if( winform.msgboxTest("发现新版本 " + remoteVersion + ",是否更新?") ){ raw.execute("https://example.com/download"); } } },winform,_APP_VERSION ) winform.show(3/*_SW_MAXIMIZE*/); win.loopMessage(); ```

我.... example.com/version.txt该如何写内容

对于你的 version.txt 文件,内容写法建议遵循**“越简单越好”**的原则。

1. 最简单的写法(推荐)

直接在文件中写入版本号数字。不要有任何 HTML 标签,也不要有多余的描述,只留一行版本号。

文件内容示例:

1.0.1

为什么这样写? 在 aardio 代码中,你使用 remoteVersion = string.trim(remoteVersion) 获取内容后,可以直接用它与本地版本号进行比较(例如 if(remoteVersion > _APP_VERSION))。字符串比较规则中 "1.0.1" > "1.0.0" 是成立的。


2. 更规范的写法(JSON 格式)

如果你以后想在弹窗里显示更新了什么内容,建议使用 JSON 格式。

文件内容示例:

{
    "version": "1.0.1",
    "description": "1. 优化了转换速度\n2. 修复了 KML 导出坐标偏移的问题",
    "url": "https://example.com/down/setup.exe"
}

对应的 aardio 代码修改: 如果你用了 JSON 格式,检测更新的代码需要稍微改一下:

thread.invoke( 
    function(winform,_APP_VERSION){
        import inet.http;
        import JSON; // 导入 JSON 库

        var http = inet.http();
        var jsonStr = http.get("http://example.com/version.json");

        if(!jsonStr) return; // 没联网直接退出

        // 解析 JSON
        var verInfo = JSON.parse(jsonStr);
        if(!verInfo) return;

        if(verInfo.version > _APP_VERSION){
            // 弹窗显示更新说明
            var msg = "发现新版本:" + verInfo.version + '\r\n' 
                    + "更新内容:" + '\r\n' + verInfo.description;

            if( winform.msgboxTest(msg, "发现更新") ){
                // 使用 JSON 里配置的地址跳转
                raw.execute(verInfo.url);
            }
        }
    },winform,_APP_VERSION
)

注意事项:

  1. 文件编码:保存 version.txt 时,请确保使用 UTF-8 编码,特别是如果你在里面写了中文更新说明。
  2. CDN/缓存问题:有些服务器或 CDN 会缓存 .txt 文件。如果你更新了服务器上的版本号但软件检测不到,可以在 URL 后面加个随机参数来禁用缓存: var remoteVersion = http.get("http://example.com/version.txt?t=" + tonumber(time()))
  3. 版本号格式:建议始终保持 X.Y.Z 的格式(如 1.0.0),且位数一致,这样简单的字符串比较 > 就能准确判断。

报错

这个错误是因为你在 thread.invoke 的线程启动函数中,将 常量 _APP_VERSION 作为了 形参(参数名)

1. 错误原因分析

在 aardio 中,以下划线开头的标识符(如 _APP_VERSION)被视为 常量

  • 语法规则: 常量不能作为函数的形参名,因为形参本质上是局部变量,而常量的值是不可修改且全局(或在特定名字空间内)只读的。
  • 报错位置: function(winform, _APP_VERSION) 这一行。编译器期望在这里看到一个普通的变量名(name),但却遇到了常量。

2. 解决方案

将线程函数的形参名修改为普通变量名(例如 version),或者在线程函数内直接访问外部传入的参数。

3. 修改后的代码

```bash import win.ui; import web.view; import wsock.tcp.simpleHttpServer; /*DSG{{*/ var winform = win.form(text="文本txt转shp或kml"; right=1024; bottom=768) winform.add() /*}}*/ // 定义当前版本(下划线开头为常量) _APP_VERSION = "0.0.0.3"; var wb = web.view(winform); // 自动启动内嵌 HTTP 服务并加载资源文件 wb.go("/res/index.html"); // 启动更新检测线程 thread.invoke( function(winform, version){ // 这里将形参名改为 version import inet.http; var http = inet.http(); // 设置较短的连接超时(毫秒) http.setTimeouts(2000, 2000, 2000); var remoteVersion = http.get("https://gtjs-9gjbu0mx.maozi.io/ruanjian/wb2shp.txt"); // 失败则静默退出 if(!remoteVersion) return; remoteVersion = string.trim(remoteVersion); // 使用传入的 version 与远程版本对比 if(remoteVersion > version){ if( winform.msgboxTest("发现新版本 " + remoteVersion + ", 是否更新?") ){ import process; process.execute("https://gtjs-9gjbu0mx.maozi.io/ruanjian/文本坐标txt转shp或kml.exe"); } } }, winform, _APP_VERSION // 这里将常量值传进去 ) winform.show(3/*_SW_MAXIMIZE*/); win.loopMessage(); ```

4. 关键改进点:

  1. 修复语法错误:function(winform, _APP_VERSION) 改为 function(winform, version)
  2. 更正 API 调用: 原代码中的 raw.execute 通常用于调用 DLL 函数。如果是打开网址或运行文件,在界面线程通常用 raw.execute(实际上底层是 ShellExecute),但在线程中推荐导入 process 库并使用 process.execute,或者直接用全局函数 execute
  3. 常量理解: 在 aardio 中,常量一旦定义就不能被修改。在多线程中,虽然可以通过参数传递常量的值,但接收该值的变量必须是普通变量。

温馨提示: 由于你的工程中使用了 wb.go("/res/index.html"),请确保工程管理器中 res 目录的 "内嵌" (embed) 属性已设为 true,这样发布后网页才能正常打包进 EXE。


文章作者: 摸鱼
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 摸鱼 !
  目录