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)