Lisp与外部进程通信

Lisp与外部进程通信,lisp,autocad,autolisp,Lisp,Autocad,Autolisp,我想做的是让AutoLISP程序调用一个可执行文件,并从该可执行文件获得响应 据我所知,我们目前可以通过startapp调用应用程序,例如 (startapp“notepad.exe”“acad.lsp”) 但据我所知,我不相信startapp可以从被调用的应用程序返回值 在上下文中,我希望能够从lisp调用应用程序,并在该应用程序关闭时,将状态代码发送回lisp,使其能够继续执行 在假lisp代码中 ( (startapp "myapp.exe" "args") (*DO UN

我想做的是让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中从该文件中读取。@WillNess这是一种方法。也不一定是坏的。理想情况下,lisp代码能够将流程存储为变量,而不是引用外部文件。谢谢另请参见:@Philip556677,我不能说我熟悉Progecad,这可能是一个愚蠢的问题,但你是否尝试过将你的命令方法设置为静态?@Nik,你知道的。这是我的第一个想法,但是vb.net没有一个“静态”的方法,所以很自然地不起作用。在阅读您的评论后,我意识到它在vb.net中被称为“共享”。现在一切都好了。英雄联盟