2011-08-14 4 views
7

에서 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 초 (I 비동기 표준 입력에 기록에 대해 생각했다) 몇 가지 이유로 두 번째로,이뿐만 아니라
실패 그런데

직접 프로그램을 실행, 표준 입력 데이터가 제공되지 않을 경우 EInputOutput 예외 (I/O 오류) 코드가 발생 6.

답변

10

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이 표시됩니다. 두 경우 모두 양식이 표시됩니다.

+0

좋아, 잘 작동합니다! 'Count Christian

+0

예, Count

+0

완료. 매력처럼 작동합니다! – Christian

3

대신 Read(buff)

InputStream := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE)); 
관련 문제