yxp 发表于 2018-4-19 11:47:48

让 Lisp 程序联网自动更新的一种方法

本帖最后由 yxp 于 2018-4-19 12:03 编辑

软件程序很难一步设计到位,通常有各种 bug,如何让 lisp 代码自动联网更新,获取最新代码?本文提供了一种轻量级的方法。用 lisp 连接 FTP 下载肯定是最快的,但是不直观,不知道更新了哪些代码。
实现思路: 用 lisp 后台分析一个网页或微博,如果找到关键字,则说明程序已更新,未找到则说明当前是最新版,不需要更新。
方法举例: 运行 lisp 打开本人的明经微博 http://www.mjtd.com/?77098,分析微博里的 lisp 代码,并下载到本地磁盘,然后让 CAD 自动加载、运行这段下载的代码。

以下代码在 win10 (x64) 系统中调试通过。

;;代码原创       by: yxp2018/04/18
(defun c:test()
(vl-load-com)
(setq addr "http://www.mjtd.com/?77098")
(setq txt (loadhtml addr))
(setq txt (car (RegExp txt "code=lisp.*/code" nil "i")))
(setq txt (substr txt 10 (- (strlen txt) 14)))
(setq txt (RegExp txt """ "\042" "gi"))
(setq f (open "d:\\test1.lsp" "w")) ;;保存到磁盘
(write-line (car txt) f)
(close f)
(load "d:\\test1.lsp")
(princ)
)


;; Lisp 读取网页信息   by: yxp2017-4-18
;;可以用 ActiveX 方法调用 post 事件,用 Lisp 写一个网络留言本在 CAD 里运行,收集客户对程序的意见。
(defun loadhtml( address / ob html)
(setq ob (vlax-create-object "Msxml2.XMLHTTP"))
(vlax-invoke-method ob "open" "get" address "false")
(if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-invoke-method (list ob "send")))
    (princ "\n当前无网络连接")
    (setq html (vlax-get-property ob "responseText"))
)
(vlax-release-object ob)
html
)


;;加载正则表达式
(defun RegExp (str mode nstr key / L)
(setq reg (vlax-create-object "vbscript.regexp"))
(vlax-put-property reg 'Pattern mode)
(foreach x '(("Global" . "*g*,*G*")("IgnoreCase" . "*i*,*I*")("Multiline" . "*m*,*M*"))
    (vlax-put-property reg (car x) (if (wcmatch key (cdr x)) 1 0)))
(if nstr (setq L (list (vlax-invoke reg 'replace str nstr)))
    (vlax-for x (vlax-invoke reg 'Execute str)(setq L (cons (vla-get-value x) L))))
(vlax-release-object reg)
(reverse L)
)






fl202 发表于 2018-4-19 17:07:18

本帖最后由 fl202 于 2018-5-15 15:09 编辑

yxp 发表于 2018-4-19 16:07
创建 Msxl2.XMLHTTP对象,调用 post 方法,发送网卡地址给服务器的 ACCESS 数据库....
是不是这样?服务器的 ACCESS 数据库是什么?
(defun posthtml(address txt1 / ob )
;;发送文字txt1到网址address
    (setq ob (vlax-create-object "Msxml2.XMLHTTP"))
    ;(setq txt1 "abc123" address "http://www.mjtd.com/home.php?mod=space&uid=344850" )
      ;(vlax-invoke-method ob "open" "get" address "false")
      (vlax-invoke-method ob "open" "post" address "false")
    ;;;...... 此处怎么写?
   
    (vlax-release-object ob)
(princ)
)

情迷法兰西0 发表于 2018-4-20 08:23:00


在下以前也写过一个,只是年久失修,源码没了,(好在可以把代码直接更新在网页端,此程序仍可下载)为此很是心痛啊,告戒大家不要轻易重装系统,装系统之前一定要备份资料啊

yxp 发表于 2018-4-19 16:07:22

fl202 发表于 2018-4-19 15:41
如果说:
我的程序发布后,我想知道我的程序大概有多少人在用?
怎么做法?谢谢!

创建 Msxl2.XMLHTTP对象,调用 post 方法,发送网卡地址给服务器的 ACCESS 数据库....

xinxirong 发表于 2018-4-19 12:34:21

沙发,yxp太牛了

fl202 发表于 2018-4-19 15:41:31

如果说:
我的程序发布后,我想知道我的程序大概有多少人在用?
怎么做法?谢谢!

ntwison 发表于 2018-4-19 21:09:27

牛了,这样也行

vectra 发表于 2018-4-19 21:30:52

服务器端也要有脚本才行

qhdycm2017 发表于 2018-4-20 07:58:58

非常不错呀,谢谢楼主共享!

airuyi 发表于 2018-4-20 09:05:20

楼主高明,创意无限啊。
页: [1] 2 3 4
查看完整版本: 让 Lisp 程序联网自动更新的一种方法