cs_ManChesTer
Messages postés
374
Date d'inscription
vendredi 20 octobre 2000
Statut
Modérateur
Dernière intervention
15 janvier 2021
20 oct. 2004 à 01:02
Hendrix,
En fait ce que tu veux faire ne peux fonctionner de cette facon, la raison est que :
Echo Hello Wold >> filename.ext
Dos ecrit hello world dans un fichier nommé filename.ext
Donc si tu fais
Echo Hello Wold >> Monprojet.exe
Dos va essayer d'effacer Monprojet.exe, de le recréer, et d'ecrire "Hello World" dans Monprojet.exe.
Il y a un autre moyen, c'est de passer par un pipe, je ne sais pas si ca te conviens, mais voici un petit exemple:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm) // un bouton 2 mémos
Button1: TButton;
Memo1: TMemo;
Memo2: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Function DosCapture(Filename:String):String;
Const Rbuffer=4096;
Var Security : TSecurityAttributes;
Start : TStartupInfo;
ProcessInfo : TProcessInformation;
WPipe,RPipe : THandle;
Buffer : Array[0..4096] of char;
BRead : Dword;
Ret : Dword;
begin
With Security do
begin
nLength := SizeOf(TSecurityAttributes);
bInheritHandle := true;
lpSecurityDescriptor := nil;
end;
if Createpipe(RPipe,WPipe,@Security, 0) then
begin
FillChar(Start,Sizeof(Start),#0);
with start do
begin
cb := SizeOf(start);
hStdOutput := WPipe;
hStdInput := RPipe;
dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
wShowWindow := SW_Hide;
end;
if CreateProcess(nil,PChar(FileName),@Security,@Security,true,
NORMAL_PRIORITY_CLASS,nil,nil,start,ProcessInfo) then
begin
repeat
Ret:=WaitForSingleObject(ProcessInfo.hProcess,50);
BRead := 0;
ReadFile(RPipe,Buffer[0],RBuffer,BRead,nil);
if BRead>0 then
begin
Buffer[BRead]:=#0;
OemToAnsi(Buffer,Buffer);
Result:=Result+String(buffer);
Form1.Memo2.Lines.Text:=Result; // visualiser ce que dos fais...
SendMessage(Form1.Memo2.Handle, WM_VSCROLL, SB_BOTTOM, 0 );
end;
Application.ProcessMessages;
until Ret<>WAIT_TIMEOUT;
end;
CloseHandle(WPipe);
CloseHandle(RPipe);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var j:Integer;
begin
Memo1.Lines.Clear;
Memo1.Lines.Text:=DosCapture('Tracert www.borland.com');
For j:=0 to Memo1.Lines.Count do // ^^^remplacer par le nom d'un .bat
If Memo1.Lines[j]='' then
Memo1.Lines.Delete(j);
end;
end.
Bon Coding ....
ManChesTer.