将 shell/dos 应用程序的输出获取到 Delphi 应用程序
我有一个用 delphi 编码的命令行应用程序,我需要从普通的桌面应用程序(也用 delphi 编码)调用它。简而言之,我想调用命令行应用程序并在列表框中“实时”显示它输出的文本。
我已经很久没有使用 shell 了,但我清楚地记得,为了从命令行应用程序中获取文本 - 我必须使用管道符号“>”。像这样:
C:/mycmdapp.exe >c:/result.txt
这会将打印到 shell 的任何文本(使用 writeLn)并将其转储到名为“result.txt”的文本文件中。
但是..(这是泡菜),我想要一个实时结果而不是一个积压文件。一个典型的例子是 Delphi 编译器本身 - 它设法向 IDE 报告正在发生的情况。如果我没记错的话,我似乎记得我必须创建一个“管道”通道(?),然后将管道名称分配给 shell 调用。
我试着用谷歌搜索这个,但老实说我不确定如何表述它。希望社区中的有人能为我指明正确的方向。
更新:此问题可能与如何在 Delphi 中运行命令行程序?。尽管标题和问题本身并不相同,但有些答案符合我正在寻找的内容。
I have a commandline application coded in delphi that I need to call from a normal desktop application (also coded in delphi). In short, I want to call the commandline app and display the text it outputs "live" in a listbox.
It's been ages since I have played around with the shell, but I distinctly remember that in order to grab the text from a commandline app - I have to use the pipe symbol ">". Like this:
C:/mycmdapp.exe >c:/result.txt
This will take any text printed to the shell (using writeLn) and dump it to a textfile called "result.txt".
But.. (and here comes the pickle), I want a live result rather than a backlog file. A typical example is the Delphi compiler itself - which manages to report back to the IDE what is going on. If my memory serves me correctly, I seem to recall that I must create a "pipe" channel (?), and then assign the pipe-name to the shell call.
I have tried to google this but I honestly was unsure of how to formulate it. Hopefully someone from the community can point me in the right direction.
Updated: This question might be identical to How do I run a command-line program in Delphi?. Some of the answers fit what I'm looking for, although the title and question itself is not identical.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
一如既往,Zarco Gajic 有一个解决方案: 捕获 DOS 的输出(命令/控制台)窗口。这是他的文章的副本,以供将来参考:
更新:
上面的示例一步读取输出。这是 DelphiDabbler 中的另一个示例,显示了如何在进程仍在运行时读取输出:
As ever so often Zarco Gajic has a solution: Capture the output from a DOS (command/console) Window. This is a copy from his article for future reference:
Update:
The above example reads the output in one step. Here is another example from DelphiDabbler showing how the output can be read while the process is still running:
您的硬盘上可能已经有代码:JCL(JEDI 代码库)的
JclSysUtils
单元中的Execute
函数可以满足您的需要:您可以为其提供回调过程:
TTextHandler = 对象的过程(const Text: string);
You probably have the code on your harddisk already: the
Execute
function in theJclSysUtils
unit of the JCL (JEDI Code Library) does what you need:You can supply it with a callback procedure:
TTextHandler = procedure(const Text: string) of object;
为了更好地理解,也做了一个答案:
您必须使用 /C 然后 cmd /c 用于在 MS-DOS 中运行命令并在命令或进程完成后终止,否则它会阻止输出到备忘录。
Did an answer too for better understanding:
You have to use /C then cmd /c is used to run commands in MS-DOS and terminate after command or process completion, otherwise it blocks output to memo.
我遇到了这个流行的解决方案,但它有点有问题。以下是解决该问题的一些更改,并删除了 VCL 部分:
I came across this popular solution, but its a bit on the buggy side. Here is some changes to resolve that, and remove the VCL parts: