1 pièce(s) jointe(s)
WD : classe cConsole -> win32 Console
Cette classe est basée sur la classe WD7DOS (disponible chez sourceforge.net ici) créée par drcharly93 et romu, reprise par Nicolas Compain ici (32 bits 64 bits). Elle permet d'exécuter des commandes win32 console (et non pas DOS comme on a toujours tendance à le dire) sans qu'une fenêtre s'ouvre pour l'utilisateur et avec possibilité d'exploiter le texte renvoyé par la commande. Pour qu'un maximim de personnes puisse l'utiliser, j'ai écrit cette classe sous windev 9. Par rapport à la classe WD7DOS elle apporte les modifications suivantes :
Définition de procédures de réception et de fin de commande -> ProcReception ProcFinCmd
Gestion de la conversion de texte OEM vers ANSI (pour les problèmes d'accents en particulier) -> SortieAnsi
Une procédure de lecture de l'état de la commande -> LireEtat
Procédure expérimentale de commande asynchrone (ne fonctionne pas pour l'instant) -> ExécuterCommandeAsync
voici un exemple d'utilisation :
Code:
1 2 3 4 5 6 7 8 9 10
| MaConsole est un cConsole
MaConsole:SetCommande("ping 192.9.0.5")
MaConsole:ProcReception = "MaProcReception"
MaConsole:ProcFinCmd = "MaProcFin"
MaConsole:ExécuterCommande()
SI ChaîneOccurrence(MaConsole:SortieAnsi(),"dépassé") ALORS
Erreur("TimeOut Ping")
SINON
Info(MaConsole:SortieAnsi())
FIN |
Avec par exemple pour les procédures locales MaProcReception et MaProcFin :
Code:
1 2 3
|
PROCEDURE MaProcReception(pSortie est une chaîne)
Trace(OemToAnsi(pSortie)) |
Code:
1 2 3
|
PROCEDURE MaProcFin()
Trace("Commande win32 console terminée") |
Si vous avez une version de windev qui exploite les entiers système ( pour version 32 64 bits) il faut enlever les commentaires dans entier //système (windev 9 ne gérait pas les entiers système).
Si vous avez des remarques à faire, des améliorations ou des corrections à apporter, des bugs à signaler faites le en forum et pas dans la contribution pour ne pas la "polluer" :P .
Ceci est la version bêta 0.1 de la classe cConsole. Elle est fournie comme cela (as is). L'utilisation de cette classe est à vos risques et périls et je ne saurais être responsable des problèmes ou des préjudices rencontrés.
Ami calmant, J.P ;)
Interaction IHM dans un thread
Bonjour à toutes et tous,
Petit message à Jurassic Pork.
Je découvre la classe et elle fait exactement ce dont j'ai besoin ... Grand merci !!!
Néanmoins, je remarque que tu utilises un thread secondaire dans la méthode ExécuterCmdAsync() et que celui-ci appelle la méthode ExécuterCmd().
S'agissant d'une exécution dans un thread secondaire il ne doit y avoir AUCUNE interaction avec l'IHM. Or dans ExécuterCmd() tu as placé des messages Erreur() qui sont autant de risques de plantages.
J'opte personnellement dans ce cas pour des traces dans un fichier journal (log).
Et encore merci pour ce boulot qui me dépanne bien.
2 pièce(s) jointe(s)
Mise à jour + projet de démo
hello,
voici une mise à jour du lisezMoi :
Citation:
classe cConsole (exploitation console windows)
Description
Cette classe est basée sur la classe WD7DOS créée par drcharly93 et romu, reprise par Nicolas Compain (adaptation 32 bits 64 bits). Elle permet d'exécuter des commandes win32 console (et non pas DOS comme on a toujours tendance à le dire) sans qu'une fenêtre s'ouvre pour l'utilisateur et avec possibilité d'exploiter le texte renvoyé par la commande.
Par rapport à la classe WD7DOS elle apporte les modifications suivantes :
Définition de procédures de réception et de fin de commande -> ProcReception ProcFinCmd
Gestion de la conversion de texte OEM vers ANSI (pour les problèmes d'accents en particulier) -> SortieAnsi
Une procédure de lecture de l'état de la commande -> LireEtat
Le code Retour de la commande ou un code d'erreur interne est renvoyé.
Une méthode d'exécution en mode asynchrone en utilisant un thread -> ExécuterCmdAsync.
Amélioration des performances du pipe de lecture en utilisant un buffer de 4096 octets (au lieu de 256).
En mode d'exécution normale (ExécuterCmd) des procédures sont disponibles :
1 - procReception pour lire à la volée ce qu'envoie la commande exécutée.
2 - procFinCmd quand la commande est terminée.
En mode d'exécution asynchrone (ExécuterCmdAsync) il faut que les procédures précédentes soient globales. L'avantage du mode asynchrone c'est de ne pas geler l'IHM en cas d'exécution de commande avec blocage en attente de timeout (comme par exemple un "net use" sur une machine qui ne répond pas).
Une méthode d'arrêt (ArrêterCmd) permet d'interrompre une commande en cours.
En cas de commande native de l'interpréteur de commande comme par exemple "dir" ne pas oublier de mettre "cmd /c " avant la commande.
La classe est fournie comme cela (as is). L'utilisation de cette classe est à vos risques et périls et je décline toute responsabilité en cas de problèmes ou de préjudices rencontrés.
Pour illustrer ceci un projet exemple windev16 contenant la classe cConsole est fourni.
En pièce jointe un projet de démo windev 16 contenant la classe cConsole version 1.1
Pièce jointe 595045
Ami calmant, J.P