Composant consoleiohandler (envoyez une commande à un executable "console" windows où dos et recupérez le résulat dans un ts

Soyez le premier à donner votre avis sur cette source.

Vue 7 242 fois - Téléchargée 1 119 fois

Description

Suite à une question du forum, j'ai créé ce petit composant qui permet l'envoie d'une commande à un executable de type "Console" Win32 où DOS et de pouvoir(c'est le but) recupéré la sortie dans un TStrings, certes il existe une méthode simple en recupérant la sortie depuis un fichier texte externe, néanmoins ce composant n'utilise pas cette technique et permet la récupération directement depuis le processus(Creation d'un PIPE)!!!

Source / Exemple :


une démo est comprise dans le zip

Conclusion :


c'est censé fonctionner sur toutes les plate-forme grâce à la duplication des processus néanmoins je n'ai pu testé que sur WindowsXP.
suite à une exception lorsque j'ai voulu compiler un code asm en utilisant TASM, il s'avère que si le programme n'est pas un Win32 en mode Console XP plante, car en effet TASM est en pure DOS bien qui fonctionne sous windows il ne possède pas de header 'PE/NT', problème regler !!! avec l'utilisation de la commande "cmd", une petite routine se charge de la vérification du programme cible(si Console Win32 où DOS)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

d'où ma note
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

Bonjour,

Un zéro pointé pour pompage d'un code ancien que l'on trouve sur tous les sites parlant de Delphi

runindos également se trouve dans un livre édition eyrolles de 2002

on le trouvait également avant 2001 traduit du langage C vers langage Delphi

donc.. un zéro pointé !

(merci d'enlever "initié" et de ne pas se citer comme créateur je rappelle que le plagia est condamnable et qu'il faut payer les droits d'auteur surtout quand ça été édité anciennement sous Copyright comme dans le cas présent)
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012

Tout d'abord bonjour à tous et désolé pour le retard, en ce moment j'ai très peu de temps devant moi pour faire des mises à jour rapidement !!,

flo160fr bonne idée mais ce n'est pas le but 1er de ce composant !!

mounjetado en principe avec cette mise à jour tu ne devrais pas trop avoir de problème il suffit de suivre l'exemple de la demo, sinon il faudrait un peu plus d'explication quant à la commande envoyé ainsi que le paramètre et programme, j'ai cru comprendre que tu avais developper ta propre Application console ?!?, dans ce cas il ne faut pas oublié que la sortie de la fenêtre console se gère avec la fonction WriteLn() voir l'aide de Delphi

jace1975 le problème de l'affichage est résolu

@+
Messages postés
81
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
12 octobre 2007
1
salut,

Commentaire un peu en retard , mais comme j'ecrit un petit interpréteur de commande en ce moment je me suis intéressé à ton code. franchement je te conseille et à ceux aussi qui liront le message par la suite d'utiliser la fonction ci-dessous qui marche vraiment bien car la tienne connait quelque limite génante , genre les rapports de pings incomplets, etc ... :

procedure RunDosInMemo(DosApp: string; AMemo: Trichedit);
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);
AMemo.Text := AMemo.text + string(Buffer);
until (BytesRead < ReadBuffer);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end;

tschussss.....
Messages postés
66
Date d'inscription
lundi 13 mars 2006
Statut
Membre
Dernière intervention
4 août 2008

bonjour,
j'ai fait une appli console pour prendre des mesures, et je voudrais maintenant récupérer mes mesures en temps réel pour les traiter. aussi ton prog m'intéresse, et je viens de télécharger ton source mais depuis j'essaie désespérément de le faire fonctionner... ou bien j'ai de sérieuses lacunes, ou alors ça manque d'infos! pour ma part, je crois qu'il y a des deux. je suis autodidacte, donc j'ignore si mon appli est viable et je ne connais pas les commandes dos en utilisant des lignes de commande... aurais-tu un tuto sur ce sujet?
merci
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.