• Accueil
  • Entreprendre
    • Communiquer sur le web
  • Programmation
    • WLangage
    • HTML / CSS
    • PHP / MYSQL
    • Javascript
    • Jquery : enrichissez vos pages webs !
    • Utilisation de CK Editor
  • Votre Ordi
    • Mieux utiliser son PC
  • Systèmes
    • Sécurisation de vos systèmes informatiques
    • Virtualisation
  • 'Geekeries'
    • Outils de développement
    • On aime
Accueil > Programmation > WLangage > Exécuter des commandes dos sans ouvrir de fenêtre
Tags
Nowwweb.com   windows   optimisation   CMS   Notepad++   Redimensionnement image   Accusé réception   Windows7   linux   Autorité de certification   MYSQL   Compte utilisateur   Facebook   office 2007   Réseau   bonnes adresses   Alixo   HTML   Google   Jquery   IpTables   Virtualisation   mail   PHP   WD16   CK EDITOR (utilisateurs)   e-mail   Référencement   Sécurisation   Javascript  

Exécuter des commandes dos sans ouvrir de fenêtre

Partager :

Vous souhaitez exécuter des commandes sans qu'une fenêtre s'ouvre pour l'utilisateur et la fonction LanceAppli() avec le paramètre exeIconise vous semble encore trop inclusive. Exemple : LanceAppli("NOTEPAD.EXE Lisezmoi.txt",exeIconise).
Une classe appelée WDDos disponible sur sourceforge a été réalisée dans ce but et placée sous licence GPL. J'en profite au passage pour remercier les auteurs (drcharly93 et romu). Cette classe est disponible à partir de WinDev 7 et a été mise en ligne en 2004. Autrement dit, elle a pris un petit coup de vieux, mais fonctionne encore avec les nouvelles versions. J'ai toutefois rencontré un problème pour les exécutables 64 bits. En effet, cette classe utilise l'API Windows pour fonctionner et certaines adresses mémoires sont différentes par rapport aux 32 bits. J'ai donc adapté cette classe afin qu'elle fonctionne dans les deux modes. Vous pouvez la télécharger directement en cliquant sur ce lien l'importation sera possible à partir de la version 16. Pour tout ce qui possède des versions de WinDev ou WebDev antérieur à la version 16, le code est disponible ci-dessous.

Exemple d'utilisation

// Instanciment de l'objet

MaCommandeDos est un WDDos

// Préparation de la ligne de commande
MaCommandeDos.CommandLine_Let("cmd /r ""echo bonjour""")

// Execution de la commande
MaCommandeDos.ExecuteCommand()
// Récupération du résultat de la commande
Info(MaCommandeDos.OutPuts())

Classe WDDos 32 et 64Bits

Dans le code de déclaration de la classe WDDos

//Structure utilisée par l"API CreateProcessA
SECURITY_ATTRIBUTES est une structure
                nLength              est un entier système
                lpSecurityDescriptor est un entier système
                bInheritHandle       est un booléen

FIN

//Structure utilisée par l"API CreateProcessA

STARTUPINFO est une structure
               
cb                  est un entier système

                lpReserved          est un entier système
                lpDesktop           est un entier système

                lpTitle             est un entier système

                dwX                 est un entier

                dwY                 est un entier

                dwXSize             est un entier

                dwYSize             est un entier

                dwXCountChars       est un entier

                dwYCountChars       est un entier

                dwFillAttribute     est un entier

                dwFlags             est un entier système

                wShowWindow         est un entier sur 2 octets

                cbReserved2         est un entier sur 2 octets

                lpReserved2         est un entier système

                hStdInput           est un entier système

                hStdOutput          est un entier système

                HStdError           est un entier système

FIN

//Structure utilisée par l"API CreateProcessA

PROCESS_INFORMATION est une structure

                hProcess            est un entier système

                hThread             est un entier système

                DwProcessID         est un entier 

                dwThreadID          est un entier

FIN

WDDos est une classe

                PRIVÉ

                               MCommand        est une chaîne                                      //Variable privée contenant la ligne de commande

                               mOutputs        est une chaîne                                          //Variable privée pour la lecture du texte renvoyer

                               ProcI           est un PROCESS_INFORMATION                 //Process utilisé

                               HLecturePipe    est un entier système    //Handle de lecture du "pipe"

                               HEcriturePipe   est un entier système    //Handle d"écriture du "pipe"

 

                CONSTANTE

                               //Constantes utilisée pour les API

                               NORMAL_PRIORITY_CLASS = 32

                               STARTF_USESTDHANDLES = 256

                               STARTF_USESHOWWINDOW = 1

                FIN

FIN


Dans la méthode CommandLine_Let

PROCEDURE CommandLine_Let(pDOSCommand est une chaîne)

//------------------------------------------------------------

// Propriété publique qui permet de passer ou de lire la ligne

// de commande passer au module

//------------------------------------------------------------

MCommand = pDOSCommand

 

Dans la méthode CommandLine_Get

PROCEDURE CommandLine_Get()

RENVOYER MCommand

 

Dans la méthode OutPuts

PROCEDURE OutPuts()

RENVOYER mOutputs

 

Dans la méthode ExecuteCommand

PROCEDURE ExecuteCommand()

//------------------------------------------------------------

// Fonction publique qui lance l"éxécution de la ligne de commande

//------------------------------------------------------------

//Variable contenant le résultat des fonction API

Resultat        est un entier

//Variable Structure utilisée par l"API CreateProcessA

Start           est un STARTUPINFO

//Variable Structure utilisée par l"API CreateProcessA

Sa              est un SECURITY_ATTRIBUTES

//Variable contenant le nombre d"octet lus dans le "pipe"

LngOctetRec     est un entier

//Variable buffer de lecture du "pipe"

STrBuff         est un chaîne ASCIIZ sur 255

 

//Ca c"est pour les couillons qui oublis de donner

//la commande avant de lancer l"exécution....

SI Taille(MCommand) = 0 ALORS

                Erreur("La commande à lancer n"a pas été renseignée!!!")

                RENVOYER ""

FIN

 

//Renseignement de la structure SECURITY_ATTRIBUTES

Sa.nLength = Dimension(Sa)

Sa.bInheritHandle = Vrai

Sa.lpSecurityDescriptor = Null

 

//Création du "Pipe" et Test du résultat

SI PAS API("KERNEL32","CreatePipe",&HLecturePipe,&HEcriturePipe,&Sa,0) ALORS

                //Si une erreur

                Erreur("Erreur de création du Pipe. Erreurr: " + ErreurInfo())

                RENVOYER ""

FIN

 

//Renseignement de la structure STARTUPINFO

Start.cb = Dimension(Start)

Start.dwFlags = ::STARTF_USESTDHANDLES + ::STARTF_USESHOWWINDOW

Start.hStdOutput = HEcriturePipe

Start.HStdError = HEcriturePipe

 

//Création du process = Exécution de la commande

lpCurrentDirectory est un entier système =0 // Type C :LPCSTR, c"est l"adresse d"une chaîne, il est aussi possible de spécifier directement une chaîne

lpEnvironment est un entier système = 0

lpApplicationName est un entier système = 0 // Type C :LPCSTR, c"est l"adresse d"une chaîne, il est aussi possible de spécifier directement une chaîne

bInheritHandles est un booléen = Vrai // Type C :BOOL

SI API("kernel32","CreateProcessA",lpApplicationName,&MCommand,&Sa,&Sa,bInheritHandles,::NORMAL_PRIORITY_CLASS,...

lpEnvironment,lpCurrentDirectory,&Start,&ProcI) <> 1 ALORS

                //            Si une erreur, fermeture des Handles

                Resultat = API("KERNEL32","CloseHandle",HLecturePipe)

                Resultat = API("KERNEL32","CloseHandle",HEcriturePipe)

                Erreur("Fichier ou commande non trouvé.")

                RENVOYER ""

FIN

 

//Fermeture du "pipe" de sortie

Resultat = API("KERNEL32","CloseHandle",HEcriturePipe)

mOutputs = ""

 

// code ajouté pour voir l"erreur lors de la lecture du "pipe"

nNumberOfBytesToRead est un entier = 256

LpOverlapped est un entier =  Null // Pointeur sur structure LPOVERLAPPED

LpBuffer est une chaîne // Type C :LPVOID

LpBuffer = Complète("",nNumberOfBytesToRead)

//Lecture du "pipe" en lecture pour récupérer les infos !

BOUCLE

                Resultat = API("KERNEL32","ReadFile",HLecturePipe, &LpBuffer, nNumberOfBytesToRead, &LngOctetRec, LpOverlapped)

                mOutputs = mOutputs + Gauche(LpBuffer, LngOctetRec)

  QUAND EXCEPTION DANS

                               //Envoie les données au programme via l"événement

                               ExécuteTraitement("WDDOS_ReceiveOutputs",trtProcédure,Gauche(STrBuff,LngOctetRec))

                FAIRE

                              

                FIN

               

                Multitâche(-1)

                SI Resultat = 0 ALORS SORTIR

FIN

 

//Fermeture de tous les Handles

Resultat = API("KERNEL32","CloseHandle",ProcI.hProcess)

Resultat = API("KERNEL32","CloseHandle",ProcI.hThread)

Resultat = API("KERNEL32","CloseHandle",HLecturePipe)

 

//Renvoie du résultat

RENVOYER(mOutputs)

Dans la méthode ClosedCommand

PROCEDURE PRIVÉE ClosedCommand()

//Variable contenant le résultat des fonction API

Resultat          est un entier

 

//Force la fermeture du process en cours

API("Kernel32","TerminateProcess",&ProcI.hProcess, 0)

//Fermeture de tous les Handles

Resultat = API("Kernel32","CloseHandle",&ProcI.hProcess)

Resultat = API("Kernel32","CloseHandle",&ProcI.hThread)

Resultat = API("Kernel32","CloseHandle",&HLecturePipe)

 

Ecrit par Nicolas COMPAIN le 12/10/2011
Dernière modification le 12/10/2011
Categorie : WLangage
Autres articles sur : Windows XP, WinDev, WD, WD16

Commentaires

De : Madara le 17/01/2019 à 13h24
Merci beaucoup pour ce précieux trésor.
De : DrCharly93 le 24/06/2015 à 23h02
Comme R&B je te remercie pour le respect de la licence. Mais encore plus pour l'avoir faite évoluée. En parcourant le net sur cette classe je m’aperçois qu'il y a encore beaucoup de manque, et je pense apporter une évolution à cette classe qui n'est plus la mienne mais la notre en parlant de tout ceux qui ont cherché à la faire évoluée.
De : R&B le 26/05/2015 à 10h31
Merci pour la citation et le respect de la licence. Un cookie si en plus vous sitez le site source (et aps seulement le stockage de la source) et merci pour avoir fait évolué la chose ! R&B

Agence web - Nos auteurs- Tutoriels- Mentions légales