컴퓨터 지식 네트워크 - 컴퓨터 지식 - delphi는 프로세스를 생성하고 프로세스의 PID를 반환합니다.

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,

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을 추가해야 합니다.

上篇: IE 브라우저 업데이트 방법 下篇: Apex 영웅 NS 버전 느린 솔루션 공유는 간단하고 효과적입니다
관련 내용