|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
SHELLANDWAIT - EXECUTER UNE APPLICATION, ATTENDRE LA FIN, ET RENVOYER SON CODE DE RETOUR
Information sur la source
Description
Encore une mini source, qui réponde au Forum. Ce module, que vous pouvez utiliser dans Excel (et tout ce qui fait du VBA) ou bien VB6 ^^ vous donne accès à la fonction ExecCmd. Cette fonction va executer la commande que vous passez en parametre, va attendre la fin de ce processus, et renvoyer le code de retour de l'application lancée. vous pouvez maintenant ouvrir les fichiers avec leurs applications principales (Word, Excel, etc) et utiliser des variables d'environnement (%COMSPEC% ou %SystemRoot%)
Source
- Public Function ExecCmd(ByRef vsCmdLine As String, Optional ByRef vsParameters As String, Optional ByRef vsCurrentDirectory As String = vbNullString, Optional ByVal vnShowCmd As Long = SW_SHOW, Optional ByVal vnTimeOut As Long = 200) As Long
- Dim lpShellExInfo As SHELLEXECUTEINFOA
- With lpShellExInfo
- .cbSize = Len(lpShellExInfo)
- .lpDirectory = vsCurrentDirectory
- .lpVerb = "open"
- .lpFile = vsCmdLine
- .lpParameters = vsParameters
- .nShow = vnShowCmd
- .fMask = SEE_MASK_DOENVSUBST Or SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_IDLIST
- End With
-
- If ShellExecuteEx(lpShellExInfo) Then
- Do While WaitForSingleObject(lpShellExInfo.hProcess, vnTimeOut) = WAIT_TIMEOUT
- DoEvents
- Loop
-
- GetExitCodeProcess lpShellExInfo.hProcess, ExecCmd
- CloseHandle lpShellExInfo.hProcess
- Else
- ExecCmd = vbError
- End If
- End Function
-
-
- 'et les déclarations :
-
- Public Const SEE_MASK_DOENVSUBST As Long = &H200
- Public Const SEE_MASK_IDLIST As Long = &H4
- Public Const SEE_MASK_NOCLOSEPROCESS As Long = &H40
- Public Const SW_HIDE As Long = 0
- Public Const SW_SHOW As Long = 5
- Public Const WAIT_TIMEOUT As Long = 258&
-
- Public Type SHELLEXECUTEINFOA
- cbSize As Long
- fMask As Long
- hwnd As Long
- lpVerb As String
- lpFile As String
- lpParameters As String
- lpDirectory As String
- nShow As Long
- hInstApp As Long
- lpIDList As Long
- lpClass As String
- hkeyClass As Long
- dwHotKey As Long
- hIcon As Long
- hProcess As Long
- End Type
-
- Public Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
- Public Declare Function GetExitCodeProcess Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpExitCode As Long) As Long
- Public Declare Function ShellExecuteEx Lib "shell32.dll" (ByRef lpExecInfo As SHELLEXECUTEINFOA) As Long
- Public Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Function ExecCmd(ByRef vsCmdLine As String, Optional ByRef vsParameters As String, Optional ByRef vsCurrentDirectory As String = vbNullString, Optional ByVal vnShowCmd As Long = SW_SHOW, Optional ByVal vnTimeOut As Long = 200) As Long
Dim lpShellExInfo As SHELLEXECUTEINFOA
With lpShellExInfo
.cbSize = Len(lpShellExInfo)
.lpDirectory = vsCurrentDirectory
.lpVerb = "open"
.lpFile = vsCmdLine
.lpParameters = vsParameters
.nShow = vnShowCmd
.fMask = SEE_MASK_DOENVSUBST Or SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_IDLIST
End With
If ShellExecuteEx(lpShellExInfo) Then
Do While WaitForSingleObject(lpShellExInfo.hProcess, vnTimeOut) = WAIT_TIMEOUT
DoEvents
Loop
GetExitCodeProcess lpShellExInfo.hProcess, ExecCmd
CloseHandle lpShellExInfo.hProcess
Else
ExecCmd = vbError
End If
End Function
'et les déclarations :
Public Const SEE_MASK_DOENVSUBST As Long = &H200
Public Const SEE_MASK_IDLIST As Long = &H4
Public Const SEE_MASK_NOCLOSEPROCESS As Long = &H40
Public Const SW_HIDE As Long = 0
Public Const SW_SHOW As Long = 5
Public Const WAIT_TIMEOUT As Long = 258&
Public Type SHELLEXECUTEINFOA
cbSize As Long
fMask As Long
hwnd As Long
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Long
hInstApp As Long
lpIDList As Long
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon As Long
hProcess As Long
End Type
Public Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpExitCode As Long) As Long
Public Declare Function ShellExecuteEx Lib "shell32.dll" (ByRef lpExecInfo As SHELLEXECUTEINFOA) As Long
Public Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Conclusion
pour le test, un simple : ExecCmd "Calc.exe" MsgBox "Calculatrice fermée" suffit. la documentation est très claire la dessus : hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Microsoft Internet Explorer is already running, it will display the document. No new process is launched, and hProcess will be NULL. en gros, si vous voulez espionner la fermeture d'un document Word, ou d'un URL, pas de soucis, si une instance d'un process a été créé spécialement... si Word est ouvert au prélable, aucune instance n'est crée, on recycle le process existant...
Fichier Zip
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
Télécharger le zip
Historique
- 01 décembre 2005 14:42:24 :
- supprimé le App.Path qui rendait incompatible le module avec VBA...
(repertoire courant en parametre optionnel)
- 02 décembre 2005 11:56:58 :
- Le TimeOut du 'WaitForSingleObject' est désormais paramétrable. (suite a une discussion collégiale, et le mot final de Draluorg)
- 20 décembre 2005 17:34:09 :
- possibilité d'ouvrir les documents, avec leurs applications principales.
- 23 janvier 2006 14:33:18 :
- colmatage d'une fuite mémoire. le flag SEE_MASK_NOCLOSEPROCESS de SHELLEXECUTEINFOA demande clairement de ne pas fermer le process... nous devons donc le fermer une fois que nous n'en avons plus besoin. (Merci BruNews)
- 23 mai 2006 13:08:36 :
- Ajout d'un paramètre 'Parameters' pour la ligne de commande.
- 25 juin 2007 10:02:23 :
- mise a jour du zip, qui ne collait plus avec la source visible en apercu
Sources du même auteur
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
attendre que le shell est fini avant de continuer mon code [ par McK_N ]
Salut,je voudrais savoir s'il existe un moyen pour que le programe attend que le shell est terminé avant de continuer dans mon code.Merci exempleshell
attendre la fin d'un shell (MS-DOS dans mon cas) mais ... [ par PaTaTe ]
je veux ke ce shell soit reduit ou invible. comment faire ?[PaTaTe]
attendre la fin d'un shell mais ... [ par PaTaTe ]
Je voudrais lancer n'importe kel fichier de maniere reduite ou invisible mais je voudrais aussi que mon programme attende la fin de CE shell. Aidez-mo
attendre la fin d'execution d'un programme [ par Thanos_the_yopper ]
bonjour,dans mon programme VB6, je lance un exe avec la commande Shell. Or, j'aurais voulu attendre la fin d'execution du programme pour continuer mon
Attendre la fin d'une commande SHELL [ par STef77 ]
Bonsoir,J'ai écrit un programme (en VB6 sp5) qui exécute plusieurs commandes shell de copie de fichiers.Mon problème est qu'il ballance ces commandes
Attendre la fin d'un SHELL [ par MaKB ]
Salut à tous,Dans un prg VB, avec la commande Shell, ja lance un Prg DOSLe problème est que les commande suivante de mon prg VB s'exécutent avant que
Attendre qu'une commande shell sois terminer avent de passer a la ligne de code suivante [ par SgtJazz ]
salutation a tous. Dans la programation d'un logiciel backup cibler sur fichiers. je cherche le moyen d,attendre la fin d,une commande shell avent de
Attendre l'apparition d'une fenêtre lancée par Shell [ par pcpt ]
[VB6] bonjour, je croyais m'en sortir seul... faut croire que non. voilà. j'ouvre une instance d'IE par Shell. je récupère son handle
attendre la fin d'execution d'une commande shell [ par nablimohavb ]
bonjoursje developpe une application qui fait l'envoie d'un fichier a une machine en mode ftpalors j'ai créer un script.bat et je fait l'appel de ce s
attendre la fin d'execution d'un programme [ par Thanos_the_yopper ]
bonjour,dans mon programme VB6, je lance un exe avec la commande Shell. Or, j'aurais voulu attendre la fin d'execution du programme pour continuer mon
|
|