在Delphi中读取程序STDIN
我有以下批处理脚本:
dir | myapp.exe
该程序有这个源(或多或少):
procedure TForm1.FormCreate(Sender: TObject);
var buff: String;
begin
Read(buff);
Memo1.Lines.Text:=buff;
end;
备忘录中的输出是:
驱动器 C 中的卷没有标签。
我尝试过:
- 将读取部分放入以
eof
作为条件的循环中 - 不知何故导致无限循环 - 写入循环以继续读取,直到
strlen(buff)
为 0 - 它由于某种原因第二次退出, - 每 0.5 秒读取一次内容(我正在考虑异步写入 stdin),这也失败了
顺便说一句,直接运行程序,没有 stdin 数据,会导致 EInputOutput 异常(I/O 错误)代码 6。
I have the following batch script:
dir | myapp.exe
And the program has this source (more or less):
procedure TForm1.FormCreate(Sender: TObject);
var buff: String;
begin
Read(buff);
Memo1.Lines.Text:=buff;
end;
And the output in the memo is:
Volume in drive C has no label.
I tried:
- putting the read part into a loop with
eof
as a condition - somehow causing an infinite loop - writing a loop to keep reading until
strlen(buff)
is 0 - it exits the second time for some reason - reading stuff ever 0.5 seconds (I was thinking about asynchronous writes to stdin), this failed as well
By the way, running the program directly, without stdin data, causes an EInputOutput exception (I/O Error) code 6.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
GUI 应用程序不会自动分配 stdin、stdout 或 stderr。您可以执行以下操作:
如果您这样做,
您将看到一个带有数字>的消息框。 0,如果这样做:
您将看到一个带有 0 的消息框。在这两种情况下,都会显示表单。
GUI apps don't have a stdin, stdout or stderr assigned automatically. You can do something like:
If you do
You'll see a messagebox with a number > 0, and if you do:
You'll see a messagebox with 0. In both cases, the form will be shown.
尝试使用流方法来代替
Read(buff)
try using a stream approach instead
Read(buff)