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