delphi는 프로세스를 생성하고 프로세스의 PID를 반환합니다.
프로그래밍 아이디어:
먼저 WIN API 함수 Createpipe를 사용하여 두 개의 파이프(Pipe)를 만든 다음 CreateProcess 함수를 사용하여 콘솔 프로그램을 만드는 프로세스를 만듭니다(여기서는 사용되는 것은 Win2000 Dos 콘솔 cmd.exe입니다. 그리고 StartUpInfo 매개변수에 지정하여 표준 입력 hStdOutput, 출력 hStdInput 및 오류 출력 장치 hStdError를 방금 생성된 세 개의 파이프로 대체합니다.
코드는 다음과 같습니다:
procedure TForm1.InitConsole;
var
보안: TSecurityAttributes; >start: TStartUpInfo;
시작
보안 시작
nlength := SizeOf(TSecurityAttributes)
binherithandle := true ;
p>lpsecuritydescriptor := nil;
Createpipe(ReadOut, WriteOut, @Security, 0); Createpipe(ReadIn, WriteIn , @Security, 0);
보안 시작
nlength := SizeOf(TSecurityAttributes)
binherithandle := true;
lpsecuritydescriptor := nil;
FillChar(Start, Sizeof(Start), #0)
start. cb := SizeOf( start);
start.hStdOutput := WriteOut;
start.hStdInput := ReadIn;
start.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW
start.wShowWindow := SW_HIDE(nil, p>
PChar('cmd'),
@Security,
@Security,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo)
end; p>그런 다음 a를 사용합니다. 타이머는 해당 출력 장치의 파이프에서 콘솔이 반환한 정보를 읽고 표시합니다.
코드는 다음과 같습니다:
function TForm1.ReadFromPipe(Pipe: THandle): string
var
Buffer: PChar ;
p>
BytesRead: DWord;
시작
결과 := ''
GetFileSize(파이프, nil) = 0 다음 종료;
Buffer := AllocMem(ReadBuffer + 1)
반복
BytesRead := 0; >ReadFile(Pipe, Buffer[0 ],
ReadBuffer, BytesRead, nil)
BytesRead > 0이면 시작
Buffer[BytesRead] := #0;
OemToAnsi(버퍼, 버퍼);
결과 := string(버퍼)
끝; BytesRead < ReadBuffer)
FreeMem(Buffer)
end; TForm1.Timer1Timer(Sender: TObject); var
s: string;
시작
s := ReadFromPipe(ReadOut)
if s <> '' then start
Memo1 .Lines.Text := Memo1.Lines.Text + s;
Memo1.SelStart := 길이(Memo1.Lines.Text); Memo1.SelLength := 0;
end;
end
아래 입력 상자에 명령을 입력하면 명령줄 입력이 실행됩니다. 입력 장치에 해당하는 파이프에 대한 명령, 코드는 다음과 같습니다:
procedure TForm1.WriteToPipe(Pipe: THandle; Value: string); >
len: 정수;
BytesWrite: DWord;
버퍼: PChar; 시작
len := 길이( 값) + 1;
버퍼 : = PChar(값 + #10)
WriteFile(Pipe, Buffer[0], len, BytesWrite, nil);
end;
절차 TForm1 .Button1Click(Sender: TObject)
시작
if Trim(cbCmd.Text) <> '' 그런 다음 시작
WriteToPipe(WriteIn, cbCmd.Text );
cbCMD.ItemIndex > -1이면
cbCMD.Items.Delete(cbCMD.ItemInd
예);
cbcmd.Items.Insert(0, cbCmd.Text)
cbCmd.Text:=''; >
end;
Dos 콘솔에서 수락하고 실행하려면 명령줄을 보낼 때 개행 문자 #10을 추가해야 합니다.