p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre Expert
    Avatar de jurassic pork
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    857
    Détails du profil
    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : décembre 2008
    Messages : 857
    Points : 1 888
    Points
    1 888

    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

  2. #2
    Membre Expert
    Avatar de jurassic pork
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    857
    Détails du profil
    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : décembre 2008
    Messages : 857
    Points : 1 888
    Points
    1 888

    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

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    octobre 2008
    Messages
    502
    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 : 502
    Points : 400
    Points
    400

    Par défaut

    Super mec, c'est exactement ce que je voulais

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2009
    Messages : 1 081
    Points : 1 789
    Points
    1 789

    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
    Membre Expert
    Avatar de jurassic pork
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    857
    Détails du profil
    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : décembre 2008
    Messages : 857
    Points : 1 888
    Points
    1 888

    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

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 Outils pour C & C++
    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