在Delphi中读取程序STDIN

发布于 2024-11-29 11:28:54 字数 556 浏览 0 评论 0原文

我有以下批处理脚本:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心在旅行 2024-12-06 11:28:54

GUI 应用程序不会自动分配 stdin、stdout 或 stderr。您可以执行以下操作:

procedure TForm1.FormCreate(Sender: TObject);
var
  Buffer: array[0..1000] of Byte;
  StdIn: TStream;
  Count: Integer;
begin
  StdIn := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE));
  Count := StdIn.Read(Buffer, 1000);
  StdIn.Free;
  ShowMessageFmt('%d', [Count]);
end;

如果您这样做,

dir *.pas | myapp.exe

您将看到一个带有数字>的消息框。 0,如果这样做:

myapp.exe

您将看到一个带有 0 的消息框。在这两种情况下,都会显示表单。

GUI apps don't have a stdin, stdout or stderr assigned automatically. You can do something like:

procedure TForm1.FormCreate(Sender: TObject);
var
  Buffer: array[0..1000] of Byte;
  StdIn: TStream;
  Count: Integer;
begin
  StdIn := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE));
  Count := StdIn.Read(Buffer, 1000);
  StdIn.Free;
  ShowMessageFmt('%d', [Count]);
end;

If you do

dir *.pas | myapp.exe

You'll see a messagebox with a number > 0, and if you do:

myapp.exe

You'll see a messagebox with 0. In both cases, the form will be shown.

不打扰别人 2024-12-06 11:28:54

尝试使用流方法来代替Read(buff)

InputStream := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE));

try using a stream approach instead Read(buff)

InputStream := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文