Cet article implémente l'exécution d'un programme console dans Delphi et affiche la sortie du programme console dans le contrôle Memo.
Au travail, j'avais besoin de compiler manuellement des programmes J2ME. J'ai commencé à écrire un programme batch, mais cela me semblait très fastidieux à utiliser, j'ai donc voulu utiliser Delphi pour créer un outil de compilation intégré. Cependant, les outils de compilation Java sont tous des programmes console. Comment capturer le programme de la console et l'afficher dans Memo. Après avoir vérifié certaines informations sur Internet et testé à plusieurs reprises, j'ai trouvé un moyen de l'implémenter. J'espère qu'il sera utile à tout le monde :
PRocédure TMainForm.RunDosInMemo(const DosApp : chaîne ; AMemo : TMemo) ;
const
{Définir la taille de ReadBuffer}
ReadBuffer = 2400 ;
var
Sécurité : TSecurityAttributes ;
ReadPipe, WritePipe : THandle ;
début : TStartUpInfo ;
ProcessInfo : TProcessInformation ;
Tampon : PChar ;
OctetsLus : DWord ;
Buf : chaîne ;
commencer
avec la sécurité faire
commencer
nlength := SizeOf(TSecurityAttributes);
binherithandle := vrai;
lpsecuritydescriptor := nul;
fin;
{Créez un canal nommé pour capturer la sortie du programme console}
si Createpipe (ReadPipe, WritePipe, @Security, 0) alors
commencer
Tampon := AllocMem(ReadBuffer + 1);
FillChar(Début, Taillede(Début), #0)
{Définir les attributs de démarrage du programme console}
avec début faire
commencer
cb := SizeOf(début);
start.lpReserved := nul;
lpDesktop := nul;
lpTitre := nul ;
dwX := 0;
dwY := 0;
dwXTaille := 0;
dwYTaille := 0;
dwXCountChars := 0;
dwYCountChars := 0;
dwFillAttribute := 0;
cbRéservé2 := 0;
lpReserved2 := néant ;
hStdOutput := WritePipe; // Dirige la sortie vers le WritePipe que nous avons créé
hStdInput := ReadPipe; //Entrée directe vers le ReadPipe que nous avons créé
hStdError := WritePipe ; // Diriger la sortie d'erreur vers le WritePipe que nous avons créé
dwFlags := STARTF_USESTDHANDLES ou STARTF_USESHOWWINDOW ;
wShowWindow := SW_HIDE;//Définir la fenêtre à masquer
fin;
essayer
{Créez un processus enfant et exécutez le programme console}
si CreateProcess(nil, PChar(DosApp), @Security, @Security, true,
NORMAL_PRIORITY_CLASS,
nul, nul, début, ProcessInfo) puis
commencer
{Attendez que le processus soit terminé}
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
{Désactivez la sortie... Je ne l'ai pas désactivé au début, par conséquent, s'il n'y a pas de sortie, le programme mourra. }
FermerHandle(WritePipe);
Buf := '';
{Lire la sortie du programme console}
répéter
OctetsLecture := 0;
ReadFile (ReadPipe, Buffer[0], ReadBuffer, BytesRead, nul);
Tampon[BytesRead] := #0;
OemVersAnsi(Tampon, Tampon);
Buf := Buf + chaîne(Tampon);
jusqu'à (BytesRead < ReadBuffer);
EnvoyerDebug(Buf);
{Divisé en fonction des nouvelles lignes et affiché dans le mémo}
tandis que pos(#10, Buf) > 0 fais
commencer
AMemo.Lines.Add(Copie(Buf, 1, pos(#10, Buf) - 1));
Supprimer(Buf, 1, pos(#10, Buf));
fin;
fin;
enfin
FreeMem (tampon);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
FermerHandle(ReadPipe);
fin;
fin;
fin;