IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

WD : classe cConsole -> win32 Console


Sujet :

Contribuez

  1. #1
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    2 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 2 012
    Points : 5 093
    Points
    5 093
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PROCEDURE MaProcReception(pSortie est une chaîne)
    Trace(OemToAnsi(pSortie))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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" .

    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
    Fichiers attachés Fichiers attachés
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    2 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 2 012
    Points : 5 093
    Points
    5 093
    Par défaut version 1.0
    voici une nouvelle mouture de la classe
    changements :
    // version 1.0 Jurassic.Pork - 9 juillet 2012
    la version est compatible 32 bits 64 bits.
    les noms des méthodes ont changé (plus courtes).
    Modification de la méthode ExécuterCmdAsync utilisation d'un ExécuterCmd lancé dans un threadExécute.
    Ajout du numéro de version en constante (cConsole::Version).
    Correction de la méthode d'arrêt.
    Les procédures ExécuterCmdAsync et ExécuterCmd renvoient maintenant le code Retour de la commande ou un code d'erreur interne.
    Amélioration des performances de lecture du pipe en utilisant un buffer de 4096 octets (au lieu de 256).

    la version minimum sera windev 12 car en windev 9 j'avais un problème avec le threadexécute sur une méthode de classe. En plus comme cela la version est compatible 32 bits 64 bits.
    J'ai mis un projet exemple dans le dépôt PCSOFT ici

    Ami calmant, J.P
    Fichiers attachés Fichiers attachés
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    octobre 2008
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : octobre 2008
    Messages : 681
    Points : 597
    Points
    597
    Par défaut
    Super mec, c'est exactement ce que je voulais

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2009
    Messages : 1 278
    Points : 2 151
    Points
    2 151
    Par défaut
    Salut JP,

    je ne sais pas si je fais bien de remonter ce post mais je voulais remonter une anomalie dans la classe....

    En fait j'ai constaté que le test sur le retour de "CreateProcessA" n'est pas cohérent avec la documentation MSDN.
    Dans la doc il indique le retour est égal à 0 s'il y a un pb lors de l'exécution de la commande or le test effectué est <> 1.

    Dans mon contexte (je teste la présence et la version de Java) cela posait un problème dans le cas où l'on venait d'installer le programme que l'on cherche à lancer.

    J'ai donc modifié la procédure ExécuterCmd :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SI API("kernel32","CreateProcessA",lpApplicationName,&:mCommande,&Sa,&Sa,bInheritHandles,::NORMAL_PRIORITY_CLASS,lpEnvironment,lpCurrentDirectory,&Start,&:ProcI) = 0 ALORS
    	//	Si une erreur, fermeture des Handles
    	Resultat = API("KERNEL32","CloseHandle",:HdLecturePipe)
    	Resultat = API("KERNEL32","CloseHandle",:HdEcriturePipe)
    	//Erreur("Fichier ou commande non trouvé.")
    	:EnCours = Faux
    	RENVOYER -1
    FIN
    Voilà, c'est tout....
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    2 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 2 012
    Points : 5 093
    Points
    5 093
    Par défaut
    Hello,
    merci Michel de ta remarque fort justifiée , j'ai mis à jour la classe (en pièce jointe) :

    // ===================================================
    // Version 1.1 Août 2015
    // Suite à remarque de Michel Souris
    // Correction du test du retour des CreateProcessA (Méthodes ExécuterCmd)
    code modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SI API("kernel32","CreateProcessA",lpApplicationName,&:mCommande,&Sa,&Sa,bInheritHandles,::NORMAL_PRIORITY_CLASS,lpEnvironment,lpCurrentDirectory,&Start,&:ProcI) = 0 ALORS
    	//	Si une erreur, fermeture des Handles
    	Resultat = API("KERNEL32","CloseHandle",:HdLecturePipe)
    	Resultat = API("KERNEL32","CloseHandle",:HdEcriturePipe)
    	Erreur("Erreur dans CreateProcessA. Possibilité : Fichier ou commande non trouvé. ")
    	:EnCours = Faux
    	RENVOYER -1
    FIN
    Ami calmant, J.P
    Fichiers attachés Fichiers attachés
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2006
    Messages : 28
    Points : 31
    Points
    31
    Par défaut 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.

  7. #7
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    2 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 2 012
    Points : 5 093
    Points
    5 093
    Par défaut Mise à jour + projet de démo
    hello,
    voici une mise à jour du lisezMoi :
    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

    Nom : Demo_cConsole.PNG
Affichages : 143
Taille : 53,8 Ko

    Ami calmant, J.P
    Fichiers attachés Fichiers attachés
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

Discussions similaires

  1. creer un projet application win32 consol
    Par sousoi dans le forum Visual Studio
    Réponses: 2
    Dernier message: 02/05/2010, 16h28
  2. Réponses: 5
    Dernier message: 11/01/2008, 10h17
  3. Appli Win32 & Console
    Par The_Baba dans le forum Visual C++
    Réponses: 4
    Dernier message: 11/07/2007, 17h18
  4. [Dev-Cpp] Différence mode Win32 Console / GUI
    Par Copros dans le forum Dev-C++
    Réponses: 1
    Dernier message: 08/06/2006, 21h45
  5. Win32 console
    Par LDDL dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 06/10/2005, 11h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo