Controle du INPUT/OUTPUT dune app, extern (console)

Résolu
lemongreen Messages postés 2 Date d'inscription lundi 1 mars 2004 Statut Membre Dernière intervention 29 mars 2005 - 29 mars 2005 à 01:47
lemongreen Messages postés 2 Date d'inscription lundi 1 mars 2004 Statut Membre Dernière intervention 29 mars 2005 - 29 mars 2005 à 16:40
Bonjours,

En language C ma question serait sur les captures stdout and stdin d`une application externe. Cependant c`est en delphi (pascal) que je tente cette experience aujourd`huit.

J`aimerais lancer par une application console, codé en delphi, le programme "netstat.exe" inclu dans tous les produits Microsoft Windows. Le programme netstat.exe serait lancé avec windows API et SW_HIDE donc caché de l`utilisateur. J`aimerais qu`au moment de son lancement tous les "stdout" , donc tous les textes générés pas "netstat.exe", soit capturé et affiché par l`entremise du programme delphi qu`il a lancé. Puis la possibilité a l`utilisateur d`envoyer une commande a "netstat.exe".

1 réponse

lemongreen Messages postés 2 Date d'inscription lundi 1 mars 2004 Statut Membre Dernière intervention 29 mars 2005
29 mars 2005 à 16:40
Oui c`est donc jai besoin.

Voici la conversion in console:

program Project2;


{$APPTYPE CONSOLE}


uses
SysUtils,
Forms,
Windows;


procedure RunDosInMemo(DosApp:String);
const
ReadBuffer = 2400;
var
Security : TSecurityAttributes;
ReadPipe,WritePipe : THandle;
start : TStartUpInfo;
ProcessInfo : TProcessInformation;
Buffer : Pchar;
BytesRead : DWord;
Apprunning : DWord;
begin
With Security do begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe (ReadPipe, WritePipe,@Security, 0) then
begin
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Start,Sizeof(Start),#0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;


if CreateProcess(nil,PChar(DosApp),@Security,@Security,true,NORMAL_PRIORITY_CLASS,nil,nil,start,ProcessInfo) then
begin
repeat
Apprunning:= WaitForSingleObject(ProcessInfo.hProcess,100);
Application.ProcessMessages;
until (Apprunning <> WAIT_TIMEOUT);
Repeat
BytesRead := 0;
ReadFile(ReadPipe,Buffer[0],
ReadBuffer,BytesRead,nil);
Buffer[BytesRead]:= #0;
OemToAnsi(Buffer,Buffer);
writeln(String(Buffer));
until (BytesRead < ReadBuffer);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end;


begin
RunDosInMemo('netstat.exe -a');
readln;
end.
0
Rejoignez-nous