本帖最后由 tryhi 于 2024-5-10 15:19 编辑
想让自己做的程序可以自动更新,但是又没有服务器该怎么做,只要把你的最新程序放到所有人都能访问的地方就可以了,这里讲如何利用QQ收藏来做这个,用很久以前的图种技术,就是把一个VLX文件合并在图片后面伪装成一张图片。
1、准备一张图片,越小越好(记下图片总共多少字节)
2、将你的程序先做好,并打包成vlx
3、将图片跟vlx放到同个目录下,假设图片名字为a.jpg,程序名字为a.vlx并新建一个txt,输入copy /b a.jpg+a.vlx b.jpg 保存后将txt改为bat,如图所示
4、双击bat文件后会得到b.jpg,这张jpg看起来跟a.jpg一摸
一样,但是其尾部其实隐藏了a.vlx的数据
5、打开QQ收藏
6、点击新建笔记、插入图片,选择特殊处理过的图片,然后加上一行文字
vlx-version(20240509)
括号内数字作为最新版本号
用来做版本判断是否要更新
7、右键转发给任意一个联系人
8、从你的联系人里面打开转发的链接,你会得到这个地址,复制下来
https://sharechain.qq.com/0caab955abff65fcd0e5392c483c5275
这个地址将填到你的程序里面
到这里基本工作已经完成了,接下来测试一下代码
- (setq wy(try-get-url "https://sharechain.qq.com/0caab955abff65fcd0e5392c483c5275"));这里填写你收藏的地址
- (setq 获取版本号(try-StrRegExp wy "vlx-version\\([^)]+"))
- (setq 版本号(substr (car 获取版本号) 13))
- (setq 下载地址(car(try-StrRegExp wy "http://shp.qpic\\.cn/collector[^\")]+")))
- (try-DownLoad 下载地址 "c:\\b.jpg");下载图片
- (setq a(try-file-ReadBinary10 "c:\\b.jpg"));读取图片
- (try-file-WriteBinary10 "c:\\a.vlx" (try-lst-move-head a 16194 ));剥离图片,这里的16194是原始图片的大小(字节数)
这段代码跑一下,看看C盘有没有出现一个a.vlx文件,有的话表示搭建正常
注:有基础的人看到这里应该知道接下来怎么做了,因为核心就是如何解决下载问题
9、下载“自动更新示例.lsp”,把这两个变量改为你对应的收藏地址跟图片大小
10、编译为VXL,把syz-vlx-path.fas放到最前面,自动更新示例.lsp放到第二进行编译(注:关于syz-vlx-path.fas请看baitang36的帖子[经验] 【原创】精确获取vlx的加载位置)
11、新编译的VLX跟原始图片合并在一起(详见第1步),然后更新图片
完成,你的VLX就可以通过QQ收藏来控制更新了
- ;;定义当前的版本号,为了节约代码,使用日期作为版本,能力强的同学可以用标准版本号格式
- (setq *banben* 20240508)
- (setq
- *收藏地址* "https://sharechain.qq.com/0caab955abff65fcd0e5392c483c5275" ;注意,这个地址必须是你自己的收藏地址,本文仅做示例
- *原始图片大小* 16194 ;这里的16194是原始图片的大小(字节数)
- )
- (if SYZ-VLX-PATH ;这里使用baitang36的获取vlx路径的fas
- (progn
- (setq *vlx路径* (vl-catch-all-apply 'SYZ-VLX-PATH nil))
- (if (vl-catch-all-error-p *vlx路径* )
- (setq *vlx路径* nil)
- )
- )
- )
- (defun 获取远程下载链接及版本号 (/ wy 版本号 获取版本号 获取下载地址 下载地址)
- (setq wy(try-get-url *收藏地址*);这里填写你收藏的地址
- 获取版本号(try-StrRegExp wy "vlx-version\\([^)]+")
- 版本号(substr (car 获取版本号) 13)
- 获取下载地址(try-StrRegExp wy "vlx-download\\([^)]+");注意,这里必须按照格式来,粘贴的地址必须是纯文本
- 下载地址(substr (car 获取下载地址) 14))
- (list (atoi 版本号)下载地址)
- )
- (setq 版本-地址(vl-catch-all-apply '获取远程下载链接及版本号));拦截错误,避免无网络等原因导致阻塞
- (if (vl-catch-all-error-p 版本-地址 )
- (princ"\n获取远程版本失败")
- (if (< *banben* (car 版本-地址));当前版本小于远程版本,需要更新
- (progn
- (setq 临时文件(vl-filename-mktemp "b.jpg") )
- (try-DownLoad (cadr 版本-地址) 临时文件);下载图片
- (setq a(try-file-ReadBinary10 临时文件));读取图片
- (vl-file-delete 临时文件)
- (setq 临时文件vlx(vl-filename-mktemp "a.vlx") )
- (try-file-WriteBinary10 临时文件vlx (try-lst-move-head a *原始图片大小* ));剥离图片,这里的16194是原始图片的大小(字节数)
- (if *vlx路径*
- (progn
- (vl-file-delete *vlx路径*);删除自身
- (vl-file-rename 临时文件vlx *vlx路径*);移动并重命名至指定目录
- (princ "\n自动更新完成")
- )
- (alert"当前版本过旧,无法获取自身路径,请手动更新")
- )
- )
- (princ "\n当前版本为最新版")
- )
- )
- ;主程序开始……
引用一下5楼的总结
总结一下就是:
1.准备原始图片a
2.将vlx文件打包进图片,附在图片数据后部,生成图片b
3.找图床,并标记版本
4.网络访问,判断版本,下载b
5.剔除图片a的数据,得到vlx
6.判断版本,如果当前版本没有远程版本新,则删除自身,把新版本覆盖过来 |
|