Lisp 与外部进程通信

标签 lisp autocad autolisp

我想做的是让 AutoLISP 程序调用一个可执行文件并从该可执行文件中获得响应。

我了解我们目前可以使用 startapp 调用应用程序,例如

(startapp "notepad.exe""acad.lsp")

但据我了解,我不相信 startapp 可以从被调用的应用程序返回值。

在上下文中,我希望能够从 lisp 调用应用程序,并且当该应用程序关闭时,将状态代码发送回 lisp 以使其继续执行。

在假的 lisp 代码中

(
    (startapp "myapp.exe" "args")
    (*DO UNTIL STATUS CODE == 1* or *"myapp.exe is stopped*
        *CODE*
    )
    *CONTINUE EXECUTION
)

如果这种性质的事情在 LISP 中是可能的,或者如果有更好的方法来查看一个进程是否在 LISP 中结束,任何方向都将不胜感激。

最佳答案

运行外部应用程序并等待完成过程您可以这样做:

(command "_Shell" (strcat path app ) )

易于运行,但无法轻松访问返回值。

或者你可以这样做

(defun Sleep (n / lastCmdecho ) 
    (setq lastCmdecho (getvar  "cmdecho"))
    (setvar "cmdecho" 0)
    (eval (list  'VL-CMDF "_.delay" n ) )
    (setvar "cmdecho" lastCmdecho )

)

(defun C:ExternalApplication (  / *error* )
    (defun *error* ( msg / ) 
        (if (not (null msg ) )  (progn (princ "\nC:ExternalApplication:*error*: " ) (princ msg ) (princ "\n")   ) )
    )
    (setq path "C:\\Windows\\")
    (setq app (strcat "Notepad.exe" ) )
    (print (strcat "Run " (strcat path app ) ) )

    (setq Shell (vlax-get-or-create-object "Wscript.Shell"))
    (setq AppHandle(vlax-invoke-method Shell 'Exec (strcat path app ) ))
    (while ( = (vlax-get-property AppHandle 'Status ) 0)
        (Sleep 1000)
    )`
    (vlax-release-object Shell) 
    (print "Process finished" )
)

现在,如果您的应用程序返回状态,您就有了。

如果您的应用程序操作 Acad 环境您可以通过系统变量 (setvar) 或环境变量 (setenv) 设置值。

如果没有,您可以将值保存到系统注册表并读取它,例如:(getcfg)

关于Lisp 与外部进程通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46981234/

相关文章:

lisp - 确保 lisp 中的 2 个列表长度相同的最简单方法是什么?

powershell - 这些功能定义不一样吗?

Lisp - 如何在另一个函数中调用一个函数?

c# - AutoCAD 命令被拒绝 : "Undo" when calling undo from LISP

lisp - 嵌套 alist 到 plist 与 alexandria

functional-programming - 是否有用于函数式编程的软件工程方法?

c++ - 从 LISP 中的套接字读取 C++ 结构

c++ - 调试 AutoCAD 模块

python - 如何使用ezdxf向折线添加“动态” AREA属性?

lisp - 转换多个对象的 vlax-ename->vla-object