Lisp 与外部进程通信
Lisp To Communicate With External Process
我想做的是让 AutoLISP 程序调用可执行文件并从该可执行文件中获得响应。
我知道我们目前可以使用 startapp 调用应用程序,例如
(startapp "notepad.exe" "acad.lsp")
但据我了解,我不认为 startapp 可以 return 来自被调用应用程序的值。
在上下文中,我希望能够从 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" )
)
现在,如果您的申请 returns 状态,您就拥有了。
如果您的应用程序操纵 Acad 环境您可以通过系统变量 (setvar)
或环境变量 (setenv)
.
设置值
如果没有,您可以将值保存到系统注册表并读取它,例如:(getcfg )
我想做的是让 AutoLISP 程序调用可执行文件并从该可执行文件中获得响应。
我知道我们目前可以使用 startapp 调用应用程序,例如
(startapp "notepad.exe" "acad.lsp")
但据我了解,我不认为 startapp 可以 return 来自被调用应用程序的值。
在上下文中,我希望能够从 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" )
)
现在,如果您的申请 returns 状态,您就拥有了。
如果您的应用程序操纵 Acad 环境您可以通过系统变量 (setvar)
或环境变量 (setenv)
.
如果没有,您可以将值保存到系统注册表并读取它,例如:(getcfg )