CAPTURE DU TEXTE D'UN PROGRAMME DOS PAR UN PIPE ...
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
8 mars 2003 à 02:17
cliquetde8
Messages postés51Date d'inscriptionmercredi 23 février 2011StatutMembreDernière intervention29 avril 2015
-
15 juil. 2013 à 03:49
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cliquetde8
Messages postés51Date d'inscriptionmercredi 23 février 2011StatutMembreDernière intervention29 avril 2015 15 juil. 2013 à 03:49
Hum question bête, comment ouvrir le projet ?
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 28 oct. 2010 à 11:19
Non mon programme ne prends aucun paramètres.
J'ai fait un autre programme qui a les memes symptomes pour que des personnes puissent tester ;)
Prog en C (compilé abvec DMC)
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main(int argc, char* argv[])
{
char c = 0;
while (c != 's')
{
c = _getch();
if (c == 's')
printf("Fin du programme.\n");
else
printf("Asc(c)=%d\n",c, (int)c);
}
return 0;
}
Fait Freezer MyDos.exe (killer le process dans le gestionnair des taches permet de sortir du freez)
Alors qu'un bête hello-world (avec un printf) s'affiche parfaitement dans MyDos.exe (même avec un while(1)printf("Try to catch me !!!");
cela valide la thèse du problème bloquant sur le stdInput mais je ne parviens pas a comprendre comment le corriger ...
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 28 oct. 2010 à 10:28
Désolé, je n'ai pas trop le temps de me replonger dans ce code, mais, si tu dois envoyer des commandes au démarrage, connais-tu ctte syntaxe purement batch :
C:\Tralala.exe <Commandes.txt
où Commandes.txt contient toutes les lignes envoyées au programme, par exemple, une ligne vide pour un Enter.
Seul bémol : ces commandes doivent être connues d'avances.
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 28 oct. 2010 à 09:37
pour poursuivre ma réflexion :
je crée un fichier batch "lancement.bat"
il contient:
PAUSE
PAUSE
PAUSE
EXIT
je lance MyDos.exe
je fait lancer un exe -> lancement.bat
le résultat est :
d:\Documents and Settings\ab84785\Bureau\from VBFRANCE>pause
Appuyez sur une touche pour continuer...
d:\Documents and Settings\ab84785\Bureau\from VBFRANCE>pause
Appuyez sur une touche pour continuer...
d:\Documents and Settings\ab84785\Bureau\from VBFRANCE>pause
Appuyez sur une touche pour continuer...
d:\Documents and Settings\ab84785\Bureau\from VBFRANCE>exit
ceci confirme donc le fait que le stdInput reçoit des choses que je ne maitrise pas ...
(et il se trouve que mon exe que à l'origine je souhaite catcher est assez sensible aux entrées)
j'ai tenté de corriger ce problème avec la création d'un nouveau pipe createpipe(hPL, hPE)
avant le createprocess je met le start.stdInput = hPL
apres le createprocess je fait closehandle hPL
et le résultat :
positif = c'est que en effet le premier pause reste bloqué
négatif = ma form est bloquée également ;)
Aurriez vous une idée a ce propos ?
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 28 oct. 2010 à 08:50
apres avoir bossé toute la nuit (sans grand succes malheureusement) j'ai pris un peu de repos et me revoici avec une question
J'ai l'impression qu'il y a un problème du côté du StdInput donné lors du createThread
Etant donné qu'on de spécifie pas le StdInput de la structure, faut-il considérer qu'on définit une StdInput=0 ?
Alors qu'est ce qui passe par ce canal ?
Je me demande si mon programme ne se mange pas des commandes qui le font planter.
Peut-on rediriger spécifiquement ce canal également ?
ps: il est fort probable que je n'ai pas compris l'intérêt du stdIntput...
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 27 oct. 2010 à 19:40
ralala, je suis en trein de chercher et il se trouve que un Pipe créé par défaut (avec createPipe) ne peut pas être assynchrone... il faut utiliser un NamedPipe
pour info, je me prends pas mal la tête parsque le dit programme dont je souhaite rediriger les entrées ecrit (printf) des labels (cheksums) de rapport de tests automatiques.
Ces label sont bien sur en hexa (voir en octal) avec une signification renseignées dans un fichier dictionnaire. Mon but est de faire en temps réel une traduction + coloration syntaxique
(ce qui marche fort bien avec comme entrée le texte du presspapier...)
je continue donc de chercher ;)
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 27 oct. 2010 à 18:53
oui, le Pipe est bien créé et j'ai le hRead et le hWrite qui sont bon,
j'ai remplacé le WM_HIDE par WM_SHOW histoire de voir le CMD.exe
lorsque je dit de ne pas intercepter les canaux (je retire STARTF_USESHOWWINDOW) mon programme s'execute normalement dans la fenetre du CMD.exe
lorsque je remet le STARTF_USESHOWWINDOW, le fenetre CMD.exe est vide. j'en conclu que j'ai bien redirigé le flux sur mon pipe. non ?
maintenant le problème provient du fait que la fonction ReadFile qui est synchrone bloc mon programme (VB6). Et le programme refuse de sortir du ReadFile ...
je suis en trein de regarder si on peut rendre assynchrone la lecture ou spécifier un timeOut...
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 27 oct. 2010 à 18:21
Oups, non, c'est le CreatePipe qui génère les hReadPipe/hWritePipe.
Il faudrait peut-être regarder si ces pointeurs sont corrects (<> 0) après le CreatePipe
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 27 oct. 2010 à 18:18
Je n'ai plus ce programme en tête, mais je crois me rappeler qu'il y a deux méthodes de récupération des données :
- Soit toutes les données renvoyées à la fin, retourné avec ExecuteCommand
- Soit récupération des données au fur et à mesure de leur arrivée, évènement ReceiveOutputs.
Le ReadFile est commun. Je ne pense pas que l'API puisse bloquer l'exécution du programme. Au pire, elle renvoie un buffer vide ou un hReadPipe/hWritePipe à 0.
Es-tu sous VB6 ?
As-tu modifié la classe ?
Le programme DOS se termine t-il ? et correctement ?
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 27 oct. 2010 à 16:40
Merci de la réponse si rapide ;)
Oui, c'est bien un "executable en mode console"
Je peux le lancer a partir de cmd.exe et il s'affiche dedans
Peut-on utiliser un FileRead non bloquant ? qui renvoie VBnullstring quand rien d'écrit par le programme ? Le freez venant du fait que le fileRead est bloquant...
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 27 oct. 2010 à 16:31
Euh ...
On est bien d'accord : cette source récupère le texte que peut être renvoyé une application de style console sous DOS.
Alors quand tu dis "J'ai un .exe avec lequel ca ne marche pas", je ne comprends pas trop ce que tu veux dire.
Tu es sous VB6 ?
Si, à la main, tu ouvres une fenêtre DOS et que tu tapes la séquence de commande, vois-tu des infos du programme appelé ressortir dans cette fenêtre ?
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 27 oct. 2010 à 16:07
Bonjour,
J'ai un .exe avec lequel ca ne marche pas. Je cherche désespérément d'ou ca peut venir.
Quand je dit que ca ne marche pas, j'entends que le programme se bloque et que plus rien ne se passe. (freez de l'appli + rien dans la "console")
Pour info, je n'ai pas le droit de donner l'appli (c'est un soft avionnique protégé)
En revenche, je peux dire qu'il dépends d'une dll nommée cygwin1.dll
J'ai désespérément cherche une astuce du genre déscendre la priorité du processus mais je n'ai pas trouvé comment faire...
Une idée d'où peut venir le problème ?
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 15 juil. 2009 à 18:42
Commentaire de BruNews le 07/09/2004 00:06:03 administrateur CS IP: 0.0.0.0
Je ne suis pas alle voir le code de sourceforge mais je signale qu'un exemple complet est fourni depuis fort longtemps dans MSDN (en C bien sur) avec la fonction CreatePipe.
blacksssnake
Messages postés3Date d'inscriptionmercredi 14 février 2007StatutMembreDernière intervention15 juillet 2009 15 juil. 2009 à 10:23
Je voudrais faire la même chose en c++, pourriez-vous me contacter en message privé. Merci
pupucenet
Messages postés5Date d'inscriptionmardi 28 septembre 2004StatutMembreDernière intervention 6 janvier 2009 6 janv. 2009 à 19:46
Bonjour,
Pour répondre a Angus59 qui attend depuis 2005 une solution pour son xcopy qui n'a pas une sortie standard comme les autres commandes, voici ce j'ai trouvé:
pour visualiser les fichiers qui seront copier
MyDOS.CommandLine = "cmd.exe /C echo.exe | xcopy.exe /EDFL g:\photos c:\photos"
et ensuite enlever l'option FL pour la copie
luluthefirst
Messages postés106Date d'inscriptionsamedi 25 avril 2009StatutMembreDernière intervention20 mars 2010 4 oct. 2008 à 19:20
Et moi je cherche pour Visual Basic 2008 Express (Visual Studion 9)
HariSeldon69210
Messages postés44Date d'inscriptionjeudi 19 juin 2008StatutMembreDernière intervention13 septembre 2008 22 juin 2008 à 14:37
cool
nablimohavb
Messages postés18Date d'inscriptionlundi 9 avril 2007StatutMembreDernière intervention27 février 2009 25 janv. 2008 à 17:40
salut
cette application m'a aider enormement
mais en executant ftp.exe sa ce plante
pourquoi?
cs_micka57
Messages postés3Date d'inscriptionmardi 13 janvier 2004StatutMembreDernière intervention24 janvier 2007 13 août 2007 à 13:29
merci RENFIELD pour ta réponse.
J'avais déjà essayer avec le process.standardoutput, mais avec cette méthode, je ne parviens à afficher la sortie standard qu'à la fin de l'exécution de la commande.
La commande que je lance s'exécute pendant environ une minute et il est préférable de voir les messages au fur et à mesure plutot que d'attendre la fin de la commande.
Vois-tu un moyen d'y parvenir ?
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 10 août 2007 à 15:12
ca servira a d'autres, remarques, comme damien_adi, par exemple
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 10 août 2007 à 15:10
la doc MSDN du framework est assez complète, avec des exemples et tout et tout.
dommage que si peu de gens aient ce reflex de la parcourir quand une question survient...
et encore, je ne code pas en .Net ^^ Google est décidement mon ami :p
cs_micka57
Messages postés3Date d'inscriptionmardi 13 janvier 2004StatutMembreDernière intervention24 janvier 2007 10 août 2007 à 14:42
Super code.
Cependant je cherche moi aussi à migrer cette source vers vb.net et cela je n'y parvient pas.
est-ce que quelqu'un a déjà rèussi ?
cs_Angus59
Messages postés12Date d'inscriptionjeudi 8 avril 2004StatutMembreDernière intervention 8 avril 2005 19 mars 2005 à 01:24
bonjour à tous,
Je galere pas mal et j'aurais besoin de votre aide, je suis un debutant confirmé lol.
J'ai pas mal parcouru le forum et les sources afin de trouver la methode du Dos-Pipe
Voila je vous explique j'ai juste créé un form avec un bouton et une textbox qui sert normalement de "Dos Output" auquel j'ai rajouté un module de classe
En precisant MyDOS.CommandLine = "ping 127.0.0.1" ca fonctionne du feu de dieu.
Mais moi ce qui m'interesse c'est une ligne de commande qui fait appel a "XCOPY.exe" ou autre chose
par exemple "xcopy.exe c:\Poub\Scans e:\tempo /s"
Mais rien ne se passe , par contre si je met cette ligne de commande dans un batch et que j'inscris MyDOS.CommandLine = "batch.bat" , le retour dans la fenetre VB me met juste ca : E:\Focal\ProjetV1_VB>xcopy.exe c:\Poub\Scans e:\tempo /s et il ne se passe rien snifff.
Ce que je voudrais c'est que l'action se lance et que je vois ce qui se passe et si possible une interaction de notre part (par ex : Ctrl C ou Y ou N ou T ......) dans la fenetre prevue comme dans une fenetre CMD pure.
Voila je c'est pas si je me fait bien comprendre, mais ca m'aiderais vraiment vous avez la solution
D'avance un grand merci
Michel.
---------------------------------------------------------------------------------------------
'Private MyDOS As DOSClass
Private WithEvents MyDOS As DOSClass
Private Sub CmdQuitter_Click()
Unload Me
End Sub
Private Sub Form_Load()
Set MyDOS = New DOSClass
End Sub
Private Sub Form_Unload(Cancel As Integer)
MyDOS.ClosedCommand
Set MyDOS = Nothing
End Sub
Private Sub MyDOS_ReceiveOutputs(CommandOutputs As String)
TextDos = TextDos & CommandOutputs
End Sub
Private Sub Command1_Click()
'Lancer
TextDos = ""
MyDOS.CommandLine = "xcopy.exe c:\Poub\Scans e:\tempo /s"
MyDOS.ExecuteCommand
End Sub
damien_adi
Messages postés1Date d'inscriptionmercredi 30 juin 2004StatutMembreDernière intervention 7 mars 2005 7 mars 2005 à 15:16
Bonjour Fredlynx,
Je cherche desesperement a faire fonctionner ce code sous VB.Net mais pas moyen, apres qque modifs, j arrive enfin a executer le code mais la fonction ReadFile ne retroune rien du process que j'execute.
QQu'un a t il deja essayé de porter ce code en .NET ?
SI oui pouvez vous me montrer comment vous avez fait ?
Merci bcp.
cs_viran
Messages postés104Date d'inscriptionjeudi 6 mai 2004StatutMembreDernière intervention31 décembre 2006 18 nov. 2004 à 19:04
par contre faire un nouvel invité de commandes avec un meilleur style ca serait genial!
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 16 nov. 2004 à 10:13
Si vous voulez vous joindre à ceux qui tente de m'aider je vous invites de tout coeur.
drcharly93
Messages postés4Date d'inscriptionvendredi 5 septembre 2003StatutMembreDernière intervention14 novembre 2004 14 nov. 2004 à 18:34
Bonjour VinceVG,
Je ne pense pas que la réponse soit là!.
Peut être est-ce moi qui est mal interprété ta question.
Moi, je voulais parler de console dos, ce que j'ai déjà réalisé.
De la à envoyer des infos à un programme en cours d'exécution il faut peut être regarder du coté des sendKeys.
En tout cas peut nous faut-il plus d'infos pour comprendre exactement ce que tu cherche à faire.
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 14 nov. 2004 à 12:54
Merci DrCharly93. J'ai essayé et je n'ai pas réussit. Soit je suis une burne (ce n'est pas à exclure totalement) soit je n'ai pas tout compris soit ce n'est pas possible.
Vince VG
cs_Fife
Messages postés73Date d'inscriptionlundi 23 octobre 2000StatutMembreDernière intervention16 mars 20083 12 nov. 2004 à 12:03
Merciiii !
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 7 nov. 2004 à 17:33
Salut zytrahus
Je bosse avec en ce moment et je connais ce code à fond.
-1- Comme toujours, il faut laisser le temps aux process externes de s'exécuter : Ajoute un simple DoEvents après le .ExecuteCommand, comme ça l'event de réception peut se déclencher.
-2- Durant l'exécution de la commande, la classe retransmet 256 octets par 256 octets le résultat qu'elle renvoie dans l'évènement "Outputs".
Pour récupérer ces données au fuir et à mesure qu'elle arrivent, il suffit, dans la forme dans laquelle tu déclares la Classe MyDOS, de bien utiliser :
Private WithEvents MyDOS As DOSClass
A partir de là, regarde parmi les objets de ta forme : Sur ta page de code, en haut à gauche, la ComboBox donne la liste, et dans cette liste, tu retrouveras l'objet que tu viens de déclarer (ici MyDOS).
Clique dessus et tu verras que l'evènement "Outputs" apparait et renvoie dans "CommandOutputs" les caractères reçus : Ce code s'exécutera à chaque fois que la classe enverra des données. A toi de les traiter.
C'est la manière la plus rapide de recevoir les données.
-2- Si tu n'as besoin des infos qu'après la fin de l'exécution de ExecuteCommand, utilise cette technique moins lourde à traiter :
Résultat = MyDOS.ExecuteCommand
ça suffit, mais il faut attendre la fin de l'exécution.
Vala.
Jack
zytrahus
Messages postés5Date d'inscriptionsamedi 6 novembre 2004StatutMembreDernière intervention24 novembre 2004 7 nov. 2004 à 10:38
excellente api
en revanche j'ai des problemes avec son utilisation dans une simple boucle => j'observe des problemes de priorités sur les instructions, exemple :
While i < 5
i = i + 1
status.Text = "TEST instruction"
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 17 oct. 2004 à 17:44
Et le contraire : envoyer des info à un prog dos, tu sais faire.
cs_viran
Messages postés104Date d'inscriptionjeudi 6 mai 2004StatutMembreDernière intervention31 décembre 2006 28 sept. 2004 à 16:52
Juste uen question a quoi ca sert de prendre du texte dans le dos y'a une commande pour ca...
AeTuOq28
Messages postés22Date d'inscriptionsamedi 2 août 2003StatutMembreDernière intervention26 octobre 2004 27 sept. 2004 à 18:22
Trop bien !
cs_frop01
Messages postés1352Date d'inscriptionlundi 27 octobre 2003StatutMembreDernière intervention19 novembre 20082 15 sept. 2004 à 14:57
Excellent !
pojick
Messages postés5Date d'inscriptionsamedi 18 janvier 2003StatutMembreDernière intervention14 septembre 2004 14 sept. 2004 à 01:17
cette source me sauve la vie!!!!
merci et surtout félicitations !
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 7 sept. 2004 à 17:17
Salut drcharly93,
y a pas de prob, c'etait juste pour rappeler qu'on n'oublie pas aussi d'aller voir les explications de l'API dans MSDN qui reste la source fondamentale en ce domaine.
Bonne continuation.
drcharly93
Messages postés4Date d'inscriptionvendredi 5 septembre 2003StatutMembreDernière intervention14 novembre 2004 7 sept. 2004 à 17:09
Bonjour BruNews,
Je m'étais mal exprimé.
J'ai traduit le code VB6 de fredLinx pour le porter sur Windev, comme ce code n'est pas de moi, j'ai pris la délicatesse d'en prévenir ici l'auteur.
[DrCCharly93] co-animateur du site rbesset.net
Merci à vous.
@+
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 7 sept. 2004 à 00:06
Je ne suis pas alle voir le code de sourceforge mais je signale qu'un exemple complet est fourni depuis fort longtemps dans MSDN (en C bien sur) avec la fonction CreatePipe.
drcharly93
Messages postés4Date d'inscriptionvendredi 5 septembre 2003StatutMembreDernière intervention14 novembre 2004 6 sept. 2004 à 23:38
Salut FredLynx,
Un petit merci pour cette ressource, et pour signaler que votre source à été portée sur Windev.
Zak888
Messages postés21Date d'inscriptionlundi 7 juin 2004StatutMembreDernière intervention21 juin 2004 18 juin 2004 à 08:30
S.U.P.E.R.B.E :-D
Bravo.
cs_Wicket
Messages postés3Date d'inscriptionvendredi 11 janvier 2002StatutMembreDernière intervention19 mai 2010 25 avril 2004 à 22:59
gg Excelente classe.j' ai trouver la source ds les trophée de VB france.
Et je pense kelle me sera utilise pour bcp de programe a venir :)
Merci et bonne continuation.
cs_cyber007
Messages postés7Date d'inscriptionvendredi 25 avril 2003StatutMembreDernière intervention25 avril 2004 25 avril 2004 à 14:48
salut fredlynx, ta méthode d'execution de commandes MS-DOS est vraiment cool, c'est beaucoup mieux que de passer par un fichier texte en utilisant le ">" :-P
J'ai juste une petite question... est-il possible d'interargir avec un process executé via ta DosClass ?
Je m'explique... mettons que je lance un nc -l -v -p 1234 avec ta méthode, j'ouvre ainsi le port 1234 de mon ordinateur afin de discuter avec un ami qui s'y connecte sans problème depuis le sien. Je vois tout ce qu'il me dit dans la textbox, mais je n'ai pas moyen de lui répondre :(
Alors grand chef, une solution ? :-D
moumoul1982
Messages postés5Date d'inscriptionmardi 17 février 2004StatutMembreDernière intervention18 février 2004 18 févr. 2004 à 13:56
Juste une question a cette source que je kiffe grave !!!
Est il possible de mettre une barre fleche sur la droite de la fenetre pour pouvoir se balader dans la fenetre une fois l execution termine ???
moumoul1982
Messages postés5Date d'inscriptionmardi 17 février 2004StatutMembreDernière intervention18 février 2004 17 févr. 2004 à 14:27
elle a l air vraiment propre ta source
Chapeau !!!!
cs_VVV
Messages postés40Date d'inscriptionmercredi 1 janvier 2003StatutMembreDernière intervention15 juin 2009 30 janv. 2004 à 21:23
Merci fredlynx pour cette excellente prog ! Canon !
Je te mets 11/10... zut ya pas moyen ;-)
Je compte l'utiliser dans un petit prog. de sauvegarde automatique... si j'ai ta permission (je déposerai la source sur vbfrance de toute manière)
V3
gabchampagne
Messages postés216Date d'inscriptionmercredi 2 avril 2003StatutMembreDernière intervention 5 mai 2004 11 janv. 2004 à 00:54
Un gros détail que j'ai cru remarqué :
si un programme dos n'affiche rien, ÇA VA BOGUER.
cs_Syborg
Messages postés4Date d'inscriptionjeudi 21 août 2003StatutMembreDernière intervention19 novembre 2003 12 déc. 2003 à 16:13
Super Taff, ça fonctionne nickel...
Juste une petite remarque, sur des applis dos lentes ou gourmandes ça bloque tout le process, tu pourrais peut être envisager de mettre la conversation en asynchrone voir en multi-threading.
philsap52
Messages postés1Date d'inscriptionlundi 15 septembre 2003StatutMembreDernière intervention 8 octobre 2003 8 oct. 2003 à 10:21
Du trés bon boulot. Félicitations
Je vais le tester plus amplement sur différents OS mais ok sous w2k.
pcpunch
Messages postés1243Date d'inscriptionmardi 7 mai 2002StatutMembreDernière intervention18 février 20195 18 juil. 2003 à 00:15
marche po avec arj.exe et doskey ?? comprend po
cs_Urgo
Messages postés780Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention16 avril 20091 21 mai 2003 à 21:49
Merci à toi pour cette source ! C d'la balle !
cs_titou2002
Messages postés50Date d'inscriptionmardi 17 septembre 2002StatutMembreDernière intervention25 avril 2005 13 mars 2003 à 23:17
a oui la ca va servir a bcp
meme peut etre meme a moi :D
je met 10 ca les vaut
cs_MyC
Messages postés94Date d'inscriptionlundi 23 septembre 2002StatutMembreDernière intervention22 avril 2003 13 mars 2003 à 11:41
Salut fredlynx,
Ton programme est excellent (10/10)!!!!
JEROMAX
Messages postés274Date d'inscriptionjeudi 22 février 2001StatutMembreDernière intervention 7 octobre 2013 10 mars 2003 à 10:52
Je cherche ce truc depuis super longtemps. Jusqu'à maintenant j'écrivais le résultat dans un fichier que j'analysais ensuite ...
C'est nettement plus propre, c'est cool !
Merci
(fonctionne très bien sous 2000)
fredlynx
Messages postés662Date d'inscriptionmercredi 16 janvier 2002StatutModérateurDernière intervention16 octobre 20103 8 mars 2003 à 17:45
Nop TheSaib... c'est juste un quartier du fruit ;)
Le fruit complet n'est pas encore mur lol lol lol
cs_max12
Messages postés1491Date d'inscriptiondimanche 19 novembre 2000StatutModérateurDernière intervention 7 juillet 2014 8 mars 2003 à 15:34
Bravo Fred, sa marche a la vapeur !! (Sous Win2k)
@+
TheSaib
Messages postés2367Date d'inscriptionmardi 17 avril 2001StatutMembreDernière intervention26 décembre 200723 8 mars 2003 à 12:49
Lu fredlynx , cette est le fruit de tout ces mois d'absence ? :)
En tout cas c'est bien.
:)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 8 mars 2003 à 02:17
Salut FredLynx
Superbe. Bien commenté, innovateur.
Très bonne source
15 juil. 2013 à 03:49
28 oct. 2010 à 11:19
J'ai fait un autre programme qui a les memes symptomes pour que des personnes puissent tester ;)
Prog en C (compilé abvec DMC)
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main(int argc, char* argv[])
{
char c = 0;
while (c != 's')
{
c = _getch();
if (c == 's')
printf("Fin du programme.\n");
else
printf("Asc(c)=%d\n",c, (int)c);
}
return 0;
}
Fait Freezer MyDos.exe (killer le process dans le gestionnair des taches permet de sortir du freez)
Alors qu'un bête hello-world (avec un printf) s'affiche parfaitement dans MyDos.exe (même avec un while(1)printf("Try to catch me !!!");
cela valide la thèse du problème bloquant sur le stdInput mais je ne parviens pas a comprendre comment le corriger ...
28 oct. 2010 à 10:28
C:\Tralala.exe <Commandes.txt
où Commandes.txt contient toutes les lignes envoyées au programme, par exemple, une ligne vide pour un Enter.
Seul bémol : ces commandes doivent être connues d'avances.
28 oct. 2010 à 09:37
je crée un fichier batch "lancement.bat"
il contient:
PAUSE
PAUSE
PAUSE
EXIT
je lance MyDos.exe
je fait lancer un exe -> lancement.bat
le résultat est :
d:\Documents and Settings\ab84785\Bureau\from VBFRANCE>pause
Appuyez sur une touche pour continuer...
d:\Documents and Settings\ab84785\Bureau\from VBFRANCE>pause
Appuyez sur une touche pour continuer...
d:\Documents and Settings\ab84785\Bureau\from VBFRANCE>pause
Appuyez sur une touche pour continuer...
d:\Documents and Settings\ab84785\Bureau\from VBFRANCE>exit
ceci confirme donc le fait que le stdInput reçoit des choses que je ne maitrise pas ...
(et il se trouve que mon exe que à l'origine je souhaite catcher est assez sensible aux entrées)
j'ai tenté de corriger ce problème avec la création d'un nouveau pipe createpipe(hPL, hPE)
avant le createprocess je met le start.stdInput = hPL
apres le createprocess je fait closehandle hPL
et le résultat :
positif = c'est que en effet le premier pause reste bloqué
négatif = ma form est bloquée également ;)
Aurriez vous une idée a ce propos ?
28 oct. 2010 à 08:50
J'ai l'impression qu'il y a un problème du côté du StdInput donné lors du createThread
Etant donné qu'on de spécifie pas le StdInput de la structure, faut-il considérer qu'on définit une StdInput=0 ?
Alors qu'est ce qui passe par ce canal ?
Je me demande si mon programme ne se mange pas des commandes qui le font planter.
Peut-on rediriger spécifiquement ce canal également ?
ps: il est fort probable que je n'ai pas compris l'intérêt du stdIntput...
27 oct. 2010 à 19:40
pour info, je me prends pas mal la tête parsque le dit programme dont je souhaite rediriger les entrées ecrit (printf) des labels (cheksums) de rapport de tests automatiques.
Ces label sont bien sur en hexa (voir en octal) avec une signification renseignées dans un fichier dictionnaire. Mon but est de faire en temps réel une traduction + coloration syntaxique
(ce qui marche fort bien avec comme entrée le texte du presspapier...)
je continue donc de chercher ;)
27 oct. 2010 à 18:53
j'ai remplacé le WM_HIDE par WM_SHOW histoire de voir le CMD.exe
lorsque je dit de ne pas intercepter les canaux (je retire STARTF_USESHOWWINDOW) mon programme s'execute normalement dans la fenetre du CMD.exe
lorsque je remet le STARTF_USESHOWWINDOW, le fenetre CMD.exe est vide. j'en conclu que j'ai bien redirigé le flux sur mon pipe. non ?
maintenant le problème provient du fait que la fonction ReadFile qui est synchrone bloc mon programme (VB6). Et le programme refuse de sortir du ReadFile ...
je suis en trein de regarder si on peut rendre assynchrone la lecture ou spécifier un timeOut...
27 oct. 2010 à 18:21
Il faudrait peut-être regarder si ces pointeurs sont corrects (<> 0) après le CreatePipe
27 oct. 2010 à 18:18
- Soit toutes les données renvoyées à la fin, retourné avec ExecuteCommand
- Soit récupération des données au fur et à mesure de leur arrivée, évènement ReceiveOutputs.
Le ReadFile est commun. Je ne pense pas que l'API puisse bloquer l'exécution du programme. Au pire, elle renvoie un buffer vide ou un hReadPipe/hWritePipe à 0.
Es-tu sous VB6 ?
As-tu modifié la classe ?
Le programme DOS se termine t-il ? et correctement ?
27 oct. 2010 à 16:40
Oui, c'est bien un "executable en mode console"
Je peux le lancer a partir de cmd.exe et il s'affiche dedans
Peut-on utiliser un FileRead non bloquant ? qui renvoie VBnullstring quand rien d'écrit par le programme ? Le freez venant du fait que le fileRead est bloquant...
27 oct. 2010 à 16:31
On est bien d'accord : cette source récupère le texte que peut être renvoyé une application de style console sous DOS.
Alors quand tu dis "J'ai un .exe avec lequel ca ne marche pas", je ne comprends pas trop ce que tu veux dire.
Tu es sous VB6 ?
Si, à la main, tu ouvres une fenêtre DOS et que tu tapes la séquence de commande, vois-tu des infos du programme appelé ressortir dans cette fenêtre ?
27 oct. 2010 à 16:07
J'ai un .exe avec lequel ca ne marche pas. Je cherche désespérément d'ou ca peut venir.
Quand je dit que ca ne marche pas, j'entends que le programme se bloque et que plus rien ne se passe. (freez de l'appli + rien dans la "console")
Pour info, je n'ai pas le droit de donner l'appli (c'est un soft avionnique protégé)
En revenche, je peux dire qu'il dépends d'une dll nommée cygwin1.dll
J'ai désespérément cherche une astuce du genre déscendre la priorité du processus mais je n'ai pas trouvé comment faire...
Une idée d'où peut venir le problème ?
15 juil. 2009 à 18:42
Je ne suis pas alle voir le code de sourceforge mais je signale qu'un exemple complet est fourni depuis fort longtemps dans MSDN (en C bien sur) avec la fonction CreatePipe.
15 juil. 2009 à 10:23
6 janv. 2009 à 19:46
Pour répondre a Angus59 qui attend depuis 2005 une solution pour son xcopy qui n'a pas une sortie standard comme les autres commandes, voici ce j'ai trouvé:
pour visualiser les fichiers qui seront copier
MyDOS.CommandLine = "cmd.exe /C echo.exe | xcopy.exe /EDFL g:\photos c:\photos"
et ensuite enlever l'option FL pour la copie
4 oct. 2008 à 19:20
22 juin 2008 à 14:37
25 janv. 2008 à 17:40
cette application m'a aider enormement
mais en executant ftp.exe sa ce plante
pourquoi?
13 août 2007 à 13:29
J'avais déjà essayer avec le process.standardoutput, mais avec cette méthode, je ne parviens à afficher la sortie standard qu'à la fin de l'exécution de la commande.
La commande que je lance s'exécute pendant environ une minute et il est préférable de voir les messages au fur et à mesure plutot que d'attendre la fin de la commande.
Vois-tu un moyen d'y parvenir ?
10 août 2007 à 15:12
10 août 2007 à 15:10
dommage que si peu de gens aient ce reflex de la parcourir quand une question survient...
http://msdn2.microsoft.com/en-us/library/system.diagnostics.process.standardoutput(vs.80).aspx
et encore, je ne code pas en .Net ^^ Google est décidement mon ami :p
10 août 2007 à 14:42
Cependant je cherche moi aussi à migrer cette source vers vb.net et cela je n'y parvient pas.
est-ce que quelqu'un a déjà rèussi ?
19 mars 2005 à 01:24
Je galere pas mal et j'aurais besoin de votre aide, je suis un debutant confirmé lol.
J'ai pas mal parcouru le forum et les sources afin de trouver la methode du Dos-Pipe
Voila je vous explique j'ai juste créé un form avec un bouton et une textbox qui sert normalement de "Dos Output" auquel j'ai rajouté un module de classe
En precisant MyDOS.CommandLine = "ping 127.0.0.1" ca fonctionne du feu de dieu.
Mais moi ce qui m'interesse c'est une ligne de commande qui fait appel a "XCOPY.exe" ou autre chose
par exemple "xcopy.exe c:\Poub\Scans e:\tempo /s"
Mais rien ne se passe , par contre si je met cette ligne de commande dans un batch et que j'inscris MyDOS.CommandLine = "batch.bat" , le retour dans la fenetre VB me met juste ca : E:\Focal\ProjetV1_VB>xcopy.exe c:\Poub\Scans e:\tempo /s et il ne se passe rien snifff.
Ce que je voudrais c'est que l'action se lance et que je vois ce qui se passe et si possible une interaction de notre part (par ex : Ctrl C ou Y ou N ou T ......) dans la fenetre prevue comme dans une fenetre CMD pure.
Voila je c'est pas si je me fait bien comprendre, mais ca m'aiderais vraiment vous avez la solution
D'avance un grand merci
Michel.
---------------------------------------------------------------------------------------------
'Private MyDOS As DOSClass
Private WithEvents MyDOS As DOSClass
Private Sub CmdQuitter_Click()
Unload Me
End Sub
Private Sub Form_Load()
Set MyDOS = New DOSClass
End Sub
Private Sub Form_Unload(Cancel As Integer)
MyDOS.ClosedCommand
Set MyDOS = Nothing
End Sub
Private Sub MyDOS_ReceiveOutputs(CommandOutputs As String)
TextDos = TextDos & CommandOutputs
End Sub
Private Sub Command1_Click()
'Lancer
TextDos = ""
MyDOS.CommandLine = "xcopy.exe c:\Poub\Scans e:\tempo /s"
MyDOS.ExecuteCommand
End Sub
7 mars 2005 à 15:16
Je cherche desesperement a faire fonctionner ce code sous VB.Net mais pas moyen, apres qque modifs, j arrive enfin a executer le code mais la fonction ReadFile ne retroune rien du process que j'execute.
QQu'un a t il deja essayé de porter ce code en .NET ?
SI oui pouvez vous me montrer comment vous avez fait ?
Merci bcp.
18 nov. 2004 à 19:04
16 nov. 2004 à 10:13
J'ai exposer mon problème là :
http://www.vbfrance.com/forum.v2.aspx?ID=331798&post=ok
Si vous voulez vous joindre à ceux qui tente de m'aider je vous invites de tout coeur.
14 nov. 2004 à 18:34
Je ne pense pas que la réponse soit là!.
Peut être est-ce moi qui est mal interprété ta question.
Moi, je voulais parler de console dos, ce que j'ai déjà réalisé.
De la à envoyer des infos à un programme en cours d'exécution il faut peut être regarder du coté des sendKeys.
En tout cas peut nous faut-il plus d'infos pour comprendre exactement ce que tu cherche à faire.
14 nov. 2004 à 12:54
Vince VG
12 nov. 2004 à 12:03
7 nov. 2004 à 17:33
Je bosse avec en ce moment et je connais ce code à fond.
-1- Comme toujours, il faut laisser le temps aux process externes de s'exécuter : Ajoute un simple DoEvents après le .ExecuteCommand, comme ça l'event de réception peut se déclencher.
-2- Durant l'exécution de la commande, la classe retransmet 256 octets par 256 octets le résultat qu'elle renvoie dans l'évènement "Outputs".
Pour récupérer ces données au fuir et à mesure qu'elle arrivent, il suffit, dans la forme dans laquelle tu déclares la Classe MyDOS, de bien utiliser :
Private WithEvents MyDOS As DOSClass
A partir de là, regarde parmi les objets de ta forme : Sur ta page de code, en haut à gauche, la ComboBox donne la liste, et dans cette liste, tu retrouveras l'objet que tu viens de déclarer (ici MyDOS).
Clique dessus et tu verras que l'evènement "Outputs" apparait et renvoie dans "CommandOutputs" les caractères reçus : Ce code s'exécutera à chaque fois que la classe enverra des données. A toi de les traiter.
C'est la manière la plus rapide de recevoir les données.
-2- Si tu n'as besoin des infos qu'après la fin de l'exécution de ExecuteCommand, utilise cette technique moins lourde à traiter :
Résultat = MyDOS.ExecuteCommand
ça suffit, mais il faut attendre la fin de l'exécution.
Vala.
Jack
7 nov. 2004 à 10:38
en revanche j'ai des problemes avec son utilisation dans une simple boucle => j'observe des problemes de priorités sur les instructions, exemple :
While i < 5
i = i + 1
status.Text = "TEST instruction"
MyDOS.CommandLine = "batch.bat"
MyDOS.ExecuteCommand
Wend
ça a pour effet de ne remplir la TextBox qu'une fois que le batch.bat ait été executé. Un moyen de palier à celà ?
18 oct. 2004 à 00:02
Ceci est réalisable via les apis Windows.
Suivre ce lien
http://www.vbfrance.com/code.aspx?ID=23012
17 oct. 2004 à 17:44
28 sept. 2004 à 16:52
27 sept. 2004 à 18:22
15 sept. 2004 à 14:57
14 sept. 2004 à 01:17
merci et surtout félicitations !
7 sept. 2004 à 17:17
y a pas de prob, c'etait juste pour rappeler qu'on n'oublie pas aussi d'aller voir les explications de l'API dans MSDN qui reste la source fondamentale en ce domaine.
Bonne continuation.
7 sept. 2004 à 17:09
Je m'étais mal exprimé.
J'ai traduit le code VB6 de fredLinx pour le porter sur Windev, comme ce code n'est pas de moi, j'ai pris la délicatesse d'en prévenir ici l'auteur.
[DrCCharly93] co-animateur du site rbesset.net
Merci à vous.
@+
7 sept. 2004 à 00:06
6 sept. 2004 à 23:38
Un petit merci pour cette ressource, et pour signaler que votre source à été portée sur Windev.
Vous trouverez le source sur :
http://sourceforge.net/project/showfiles.php?group_id=84918&package_id=120239
sous le nom de WDDos.
18 juin 2004 à 08:30
Bravo.
25 avril 2004 à 22:59
Et je pense kelle me sera utilise pour bcp de programe a venir :)
Merci et bonne continuation.
25 avril 2004 à 14:48
J'ai juste une petite question... est-il possible d'interargir avec un process executé via ta DosClass ?
Je m'explique... mettons que je lance un nc -l -v -p 1234 avec ta méthode, j'ouvre ainsi le port 1234 de mon ordinateur afin de discuter avec un ami qui s'y connecte sans problème depuis le sien. Je vois tout ce qu'il me dit dans la textbox, mais je n'ai pas moyen de lui répondre :(
Alors grand chef, une solution ? :-D
18 févr. 2004 à 13:56
Est il possible de mettre une barre fleche sur la droite de la fenetre pour pouvoir se balader dans la fenetre une fois l execution termine ???
17 févr. 2004 à 14:27
Chapeau !!!!
30 janv. 2004 à 21:23
Je te mets 11/10... zut ya pas moyen ;-)
Je compte l'utiliser dans un petit prog. de sauvegarde automatique... si j'ai ta permission (je déposerai la source sur vbfrance de toute manière)
V3
11 janv. 2004 à 00:54
si un programme dos n'affiche rien, ÇA VA BOGUER.
12 déc. 2003 à 16:13
Juste une petite remarque, sur des applis dos lentes ou gourmandes ça bloque tout le process, tu pourrais peut être envisager de mettre la conversation en asynchrone voir en multi-threading.
8 oct. 2003 à 10:21
Je vais le tester plus amplement sur différents OS mais ok sous w2k.
18 juil. 2003 à 00:15
21 mai 2003 à 21:49
13 mars 2003 à 23:17
meme peut etre meme a moi :D
je met 10 ca les vaut
13 mars 2003 à 11:41
Ton programme est excellent (10/10)!!!!
10 mars 2003 à 10:52
C'est nettement plus propre, c'est cool !
Merci
(fonctionne très bien sous 2000)
8 mars 2003 à 17:45
Le fruit complet n'est pas encore mur lol lol lol
8 mars 2003 à 15:34
@+
8 mars 2003 à 12:49
En tout cas c'est bien.
:)
8 mars 2003 à 02:17
Superbe. Bien commenté, innovateur.
Très bonne source