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>

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)) ;

끝;

끝;

끝.