Red de conocimiento del abogados - Preguntas y respuestas jurídicas - delphi crea un proceso y devuelve el PID del proceso

delphi crea un proceso y devuelve el PID del proceso

Ideas de programación:

Primero, use la función Createpipe de WIN API para crear dos tuberías (Pipe) y luego cree un proceso que use la función CreateProcess para crear un programa de consola (aquí utilizado es la consola Win2000 Dos cmd.exe), y especifique en el parámetro StartUpInfo reemplazar la entrada estándar hStdOutput, la salida hStdInput y el dispositivo de salida de error hStdError con las tres tuberías que acaba de crear.

El código es el siguiente:

procedimiento TForm1.InitConsole

var

Seguridad: TSecurityAttributes

iniciar: TStartUpInfo;

comenzar

con Seguridad comenzar

nlength := SizeOf(TSecurityAttributes

binherithandle := true);

p>

lpsecuritydescriptor := nil;

end;

Createpipe(ReadOut, WriteOut, @Security, 0); Createpipe(ReadIn, WriteIn, @Security, 0);

con Seguridad comienza

nlength := SizeOf(TSecurityAttributes);

binherithandle := true;

lpsecuritydescriptor := nil;

fin;

FillChar(Inicio, Tamaño de(Inicio),

inicio. cb := TamañoDe( inicio);

start.hStdOutput := Escritura

start.hStdInput := Lectura

start.hStdError := Escritura;

start.dwFlags := STARTF_USESTDHANDLES +

STARTF_USESHOWWINDOW;

start.wShowWindow := SW_HIDE

CreateProcess(nil,

p>

PChar('cmd'),

@Seguridad,

@Seguridad,

verdadero,

NORMAL_PRIORITY_CLASS,

nil,

nil,

inicio,

InfoProceso)

fin; p> Luego use un El temporizador lee la información devuelta por la consola desde la tubería del dispositivo de salida correspondiente y la muestra.

El código es el siguiente:

función TForm1.ReadFromPipe(Pipe: THandle): string

var

Buffer: PChar;

p>

BytesRead: DWord

comenzar

Resultado := ''; nil) = 0 y luego Salir;

Buffer := AllocMem(ReadBuffer + 1

repetir

BytesRead := 0; >ReadFile(Pipe, Buffer[0 ],

ReadBuffer, BytesRead, nil

si BytesRead > 0 entonces comienza

Buffer[BytesRead] := #0;

OemToAnsi(Buffer, Buffer);

Resultado:= cadena(Buffer); BytesRead < ReadBuffer);

FreeMem(Buffer);

fin;

procedimiento TForm1.Timer1Timer(Remitente: TObject); var

s: cadena

comenzar

s := ReadFromPipe(ReadOut);

if s <> '' luego comenzar;

Memo1 .Lines.Text := Memo1.Lines.Text + s;

Memo1.SelStart := Longitud(Memo1.Lines.Text

Memo1.SelLength := 0;

end;

end;

Después de ingresar el comando en el cuadro de entrada a continuación, la entrada de la línea de comando se realiza enviando el comando a la tubería correspondiente al dispositivo de entrada, el código es el siguiente:

procedimiento TForm1.WriteToPipe(Pipe: THandle; Valor: cadena

var

len: entero;

BytesWrite: DWord;

Buffer: PChar;

comenzar

len := Longitud( Valor) + 1;

Búfer: = PChar(Valor + #10);

WriteFile(Pipe, Buffer[0], len, BytesWrite,

);

finalizar;

procedimiento TForm1 .Button1Click(Remitente: TObject);

comenzar

if Trim(cbCmd.Text) <> '' y luego comenzar.

WriteToPipe(WriteIn, cbCmd.Text

si cbCMD.ItemIndex > -1 entonces

cbCMD.Items.Delete(cbCMD.ItemInd);

ex);

cbcmd.Items.Insert(0, cbCmd.Text;

cbCmd.Text:='';

end; >

end;

Cabe señalar aquí que el carácter de nueva línea #10 debe agregarse al enviar la línea de comando para que sea aceptado y ejecutado por la consola Dos