Delphi는 DOS를 호출하고 결과 세트를 출력합니다.
unit Unit1;
인터페이스
사용
Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식, < /p>
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
절차 FormClose(Sender: TObject; var Action: TCloseAction);
프로시저 FormCreate(Sender: TObject);
프로시저 ress(Sender: TObject; var Key: Char); >
private
{ Private 선언 }
public
{ Public 선언 }
end;
var
Form1: TForm1;
ReadOut, WriteOut: THandle;
ReadIn, WriteIn: THandle;
ProcessInfo: TProcessInformation;
구현
{$R *.dfm}
절차 InitConsole {콘솔 시작 속성 설정}
var
Secu: TSecurityAttributes;
start: TStartUpInfo;
buf: Char의 배열[0..MAX_PATH];
begin // MAX_PATH p> p>
Secu do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
< p> lpsecuritydescriptor:= nil;end;
Createpipe(ReadOut, WriteOut, @Secu, 0) {콘솔 프로그램의 출력을 캡처하기 위한 명명된 파이프 생성}< /p>
Createpipe(ReadIn, WriteIn, @Secu, 0); {콘솔 프로그램의 입력을 캡처하기 위한 두 번째 명명된 파이프 생성}
GetEnvironmentVariable('comspec', buf, SizeOf( buf)) ;
ZeroMemory(@start, SizeOf(start));
>start.cb:= SizeOf(start);
start.hStdOutput:= WriteOut;
start.hStdInput:= ReadIn;
start.hStdError: = WriteOut;
start.dwFlags:= STARTF_USESTDHANDLES
STARTF_USESHOWWINDOW;
start.wShowWindow:= SW_HIDE;
CreateProcess(nil, buf,
@Secu, @Secu, true,
NORMAL_PRIORITY_CLASS,
nil, nil, start, ProcessInfo)
end ;
함수 ReadFromPipe: 문자열;
var
buf: Char 배열[0..1024];
BytesRead: DWord ;
시작
결과:= '';
동안
BytesRead gt 0 do
시작 //데이터를 읽는 루프입니다.
if ReadFile(ReadOut, buf, SizeOf(buf), BytesRead, nil) then
시작
결과:= 결과 Copy(buf, 1, BytesRead );
WaitForSingleObject(ProcessInfo.hProcess, 10);
// Form1.Memo1.Lines.Add('a ' inttostr(BytesRead)); > end
else
break;
PeekNamedPipe(ReadOut, nil, 0, nil, @BytesRead, nil) //데이터가 있는지 확인합니다. 파이프.
// Form1.Memo1.Lines.Add('b ' inttostr(BytesRead))
end
procedure WriteCMD(값: 문자열);
var
len: 정수;
BytesWrite: DWord;
버퍼: PChar;
begin
len := Length(Value) 2;
Buffer := PChar(Value #13#10); //명령과 내용은 다음과 같습니다. 한 줄에 나타나지 않습니다.
WriteFile(WriteIn, Buffer[0], len, BytesWrite, nil)
end
CloseConsole 시작;
TerminateProcess(ProcessInfo.hProcess, 0);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadIn);
CloseHandle(WriteIn);
CloseHandle(ReadOut);
CloseHandle(WriteOut);
end ;
TForm1.FormClose(Sender: TObject; var Action: TCloseAction) 절차;
begin
CloseConsole;
end;< /p>
TForm1.FormCreate(Sender: TObject) 절차;
시작
InitConsole;
end;
절차 TForm1.ress(Sender: TObject; var Key: Char)
var
s, ss: string;
i, j: 정수; p>
p>
시작
if Key = #13이면
시작
i := Memo1.Lines.Count - 1;
< p> s:= Memo1.Lines[i];delete(s, 1, pos('gt;', s));
WriteCMD( TRIM(s)) ;
//WaitForSingleObject(ProcessInfo.hProcess, 10000); //WAIT_TIMEOUT);
sleep(1);
// ss := TRIM( ReadFromPipe);
// for j = (Memo1.Lines.Count-1) downto 0 do
// 시작
/ / if Memo1.Lines [j] = '' then Memo1.Lines.delete(j);
// end;
Memo1.Lines.Add(TRIM(ReadFromPipe)) ;
끝;
끝;
끝.