SHELLANDWAIT - EXECUTER UNE APPLICATION, ATTENDRE LA FIN, ET RENVOYER SON CODE D

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 1 déc. 2005 à 14:23
SgtKabukinan Messages postés 106 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 23 janvier 2010 - 17 nov. 2009 à 15:34
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/34867-shellandwait-executer-une-application-attendre-la-fin-et-renvoyer-son-code-de-retour

SgtKabukinan Messages postés 106 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 23 janvier 2010
17 nov. 2009 à 15:34
impeccable !
rien à redire, fonctionne du premier coup
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
10 mars 2009 à 14:13
Très bonne source :)

Merci Renfield !
PROTEUS91 Messages postés 156 Date d'inscription mardi 4 novembre 2003 Statut Membre Dernière intervention 28 décembre 2010
25 juil. 2007 à 10:23
Renfield, Merci pour ton code a l'heure actuel j'utilisais un truc pas tres jolie pour faire fonctionner une appli. Ton code m'aide bcp

Merci.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 juin 2007 à 10:03
il s'agit du parametre nommé 'vsParameters' :

if ExecCmd ("c:\monapplication.exe", "-x -y") = 0 then
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
24 juin 2007 à 16:17
promiage123 Messages postés 14 Date d'inscription samedi 15 octobre 2005 Statut Membre Dernière intervention 23 août 2007
24 juin 2007 à 16:02
je fais comme ca ?
if ExecCmd ("c:\monapplication.exe") = 0 then
msgbox "ok"
else
msgbox "non"
end if

et si c'est ca , comment je lui passe des paramatres :
ExecCmd ("c:\monapplication.exe -x -y") ??
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 juin 2007 à 15:55
Tout à fait cela, fonce.
promiage123 Messages postés 14 Date d'inscription samedi 15 octobre 2005 Statut Membre Dernière intervention 23 août 2007
24 juin 2007 à 15:52
bonjour ,
stp je suis nouveau sur vb excusez moi
je voulais juste savoir si c'est avec ce module qu'on va recuperer la valeur de retour d'un executable lancé depuis vb !
j'ai une application qui retourne 0 si tout marche bien sinon elle retourne >0 si erreur
je voudrai savoir comment faire ca svp ! j'en ai vraiment besoin
cs_lucgod1 Messages postés 10 Date d'inscription dimanche 17 septembre 2006 Statut Membre Dernière intervention 24 janvier 2007
21 oct. 2006 à 13:21
Moi, j'utilise - mais j'ai stocké tes infos Renfield -
Visual Basic 2005 (c'est renseigné dans MSDN LIBRARY en français) ...

Public Shared Function gowr(ByVal prog As String, ByVal param As String) As String
Dim procID As Integer
Dim newProc As Diagnostics.Process
newProc = Diagnostics.Process.Start(prog, param)
procID = newProc.Id
newProc.WaitForExit()
Dim procEC As Integer = -1
If newProc.HasExited Then
procEC = newProc.ExitCode
End If
MsgBox("Process with ID " & CStr(procID) & _
" terminated with exit code " & CStr(procEC))
gowr = CStr(procEC)
End Function

MERCI & BYE.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 mars 2006 à 11:56
c'est sensé être autorisé, mais ne fonctionne effectivement pas...
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
15 mars 2006 à 11:39
En fait j'ai posé ma question ici car elle concerne l'utilisation de ta source (indirectement ou directement je sais pas trop).

Sinon Mailto ne permet pas d'ajouter de piece jointes (à ma connaissance).
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 mars 2006 à 11:11
pourquoi posez vous vos question ici, et pas sur le Forum, au fait .. ??
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 mars 2006 à 11:09
tu peux toujours utiliser Mailto...

pour ta dll, je pense qu'il faut regarder du coté de Rundll32.exe
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
15 mars 2006 à 09:50
Salut, j'ai une question.

Depuis Windows lorsque l'on fait clique droit sur un fichier :
Envoyer vers >> Destinataire
Le fichier est mis en pièces jointes dans un email.

J'ai regardé dans le dossier SendTo, le fichier qui gère ça est un fichier de type .MAPIMAIL ne contenant aucune données (0 octets).
Il se produit la même chose lorsque l'on fait un drag drop sur ce fichier .MAPIMAIL

J'ai donc essayé de faire :
Call ExecCmd("Lettre:/Chemin/Toto.MAPIMAIL " & CheminDunFichier)
Mais cela ne fonctionne pas.

Mes recherches dans la base de registre ont été infructueuses.
Je n'ai trouvé qu'une référence à une DLL
C:\WINDOWS\system32\sendmail.dll

Est-il possible de faire ce que j'essaie de faire ? Si oui quelle commande executer ?
Merci d'avance
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 mars 2006 à 09:34
le forum est là pour ça...
que cherches tu a faire ?

(pour lancer un programme depuis VB, au choix, Shell, ou l'API ShellExecute)
cs_sofhak Messages postés 5 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 15 mars 2006
15 mars 2006 à 09:25
urgent: je veux savoir comment lançer une application externe a pa partir de vb en arriere plan
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 janv. 2006 à 14:34
source mise a jour...

le nom du flag de SHELLEXECUTEINFOA ( SEE_MASK_NOCLOSEPROCESS) a pourtant un nom qui aurait du me faire tilter plus tôt

Merci BruNews
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 janv. 2006 à 14:21
oui, dans ce cas, au moins, c'est bien ce que je me disai....

un "warning" sur MSDN serait de bon gout...
ou est-ce implicite et seulement moi qui suis en cause ?

bref, quoi qu'il en soit, merci pour l'info.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 janv. 2006 à 13:33
ShellExecuteEx ne renvoie pas systématiquement un handle (voir membre fMask dans MSDN), seulement dans ce cas.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 janv. 2006 à 13:19
ok... comme j'avais rien vu là dessus sur MSDN, concernant ShellExecuteEx, je pensais pas qu'il fallais appeler CloseHandle...

donc, systématiquement, ShellExecuteEx -> CloseHandle ??
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 janv. 2006 à 13:00
Y a rien d'automatique en prog, c'est pas du VB mais API.
Tu pourrais vouloir faire un OpenProcess avec le handle ou que sais-je encore, tout est envisageable.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 janv. 2006 à 12:32
Ah... Merci pour l'info...

Qu'est-ce qui fait qu'il faille appeler le CloseHandle nous même ?
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 janv. 2006 à 12:24
Fuite mémoire
Derrière GetExitCodeProcess, il manque:
CloseHandle tShellExInfo.hProcess
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
21 déc. 2005 à 12:00
Oui, en fait j'ai juste suivi le conseil de DarkSidious car dans mon cas les applis lancées peuvent rester ouverte pendant un petit moment (moyenne 1 minute je pense).

Merci
Bonne prog
++
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 déc. 2005 à 09:54
tout est revenu dans l'ordre, ok...

desolé d'avoir ajouté ce parametre entre les duex, mais a mon sens, modifier le TimeOut, est quelque chose de rare, ou au moins moins évident que la visibilité de la fenêtre...

bonne journée ^^
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
21 déc. 2005 à 09:40
Je veux attendre la fin car j'ai des PDF de type formulaires.
On peux donc y modifier des champs. J'attends la fin, je controle le CRC et vérifie si mon fichier a été modifié.

Sinon, pour mon problème d'affichage d'Acrobat. J'ai voulu passé la valeur vbNormalFocus comme tu me l'as dis et là... je me suis rendu compte que je n'avais pas modifié mon appel de la procédure à la suite de la dernière MAJ de Renfield. J'avais donc un truc du genre :
Call ExecCmd(sArchive, , 1000)
Il y avait un argument de moins dans l'ancienne. Je passais donc 1000 à vnShowCmd. J'ai rajouté une virgule et maintenant c'est OK.

Merci.
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
21 déc. 2005 à 08:28
Pour un fichier Pdf, je ne vois pas pourquoi tu voudrais attendre la fin, dans ce cas un simple Shell suffit.
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
21 déc. 2005 à 08:25
Essaie de passer la valeur vbNormalFocus (et non vbHide) pour le paramètre vnShowCmd
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
20 déc. 2005 à 18:02
AARGHHH!!! Ca marche pas avec mes PDF. Acrobat se lance mais reste en HIDE... Quelqu'un a-t-il le même problème ?

PS : Je suis sous Acrobat 5 (pas le Reader).
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
20 déc. 2005 à 17:41
Trop classe. Merci Renfield... :-)
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
20 déc. 2005 à 17:40
Re,

Encore mieux bravo Renfield ;)

++
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 déc. 2005 à 17:35
code refondu....

possibilité de faire simplement :

ExecCmd App.Path & "\MonDocument.doc"
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
20 déc. 2005 à 16:45
Salut Bouv, salut a tous,

Eh je pense que ce serait plus simple dans ton cas d'utiliser ShellExecute, et de faire un OpenProcess suivi d'un loop until StillActive...
Si ShellExecute ne te permet pas de recuper le Pid du processus lance, tu peux garder la methode de ReynField mais avec Cmd...

Ex:
Exec "Cmd /C Start /W " & File

Normalement Start fait appel a ShellExecute...

++
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
20 déc. 2005 à 16:37
Au fait sArchive est le chemin de mon fichier à lancé
Et le Me.Enable = True n'a rien à faire là...
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
20 déc. 2005 à 16:34
OK. J'ai juste du mal à comprendre comment dans un prog VB (non multithread)le code peut rester bloquer dans une procedure et en executer une autre. Enfin bon, l'essentiel c'est que cela fonctionne.

Sinon, j'ai une autre question. Quand je veux lancer un fichier avec le prog associé j'utilise le code suivant :

CommandeShell = BDR_Lire("HKEY_CLASSES_ROOT\." & FileExtension & "")
CommandeShell = BDR_Lire("HKEY_CLASSES_ROOT" & CommandeShell & "\Shell\open\command")
CommandeShell = Replace$(CommandeShell, Chr$(34), "")
CommandeShell = Replace$(CommandeShell, "%1", sArchive)
Call ExecCmd (CommandeShell)
Me.Enabled = True

Sauf qu'avec les documents Word cela ne fonctionne pas car par de %1 dans la commande. Quelqu'un connait-il la commande à executer ?
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
20 déc. 2005 à 16:14
> Mais le reste de la feuille est utilisable

C'est tout à fait normal, et ta solution est bonne.
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
20 déc. 2005 à 16:08
Exactement ce que je cherchais. J'ai failli mettre une demande sur le Forum... lol
En fait j'avais déjà un code qui fait la même chose, sauf qu'à chaque fois que je fermait l'appli lancée (Calc.exe par ex) mon soft principal plantait.
Avec ton code : NIKEL. Merci pour ce fameux code. 10/10

Par contre, une chose bizare. Si j'ai

Private Sub Form_Load()
ExecCmd "Calc.exe"
MsgBox "Calculatrice fermée"
End Sub

Le code reste bien bloqué avant MsgBox "Calculatrice fermée".
Mais le reste de la feuille est utilisable... Je suis obligé de faire :

Private Sub Form_Load()
Me.Enable = False
ExecCmd "Calc.exe"
Me.Enable = True
MsgBox "Calculatrice fermée"


End Sub
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
2 déc. 2005 à 11:58
j'acquiesce et j'ai mis a jour le code, rendant parametrable cette durée du TimeOut
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
2 déc. 2005 à 11:39
Salut a tous,

---------------------------------------------------------------
Citation:
"pour t'en convaincre, met en place la modification que tu propose
et met ce code dans le Form_Load

Private Sub Form_Load()
Me.Show
DoEvents
ExecCmd "Calc.exe"
MsgBox "Calculatrice fermée"
End
End Sub
Lance le programme, et déplace la calculatrice... "
---------------------------------------------------------------

Eh wai j'avais deja teste, et je vois ce que tu veux dire, apres c'est une question de choix... Dans un code sans "interface" je pense qu'il est preferable d'utiliser "ma modif" ou dans un sub main par exemple...

Sinon pour le probleme du Temps de timing, bah ca depend des cas... si vous lancez une operation qui ne doit durer que quelque diziemes de secondes, et que vous devez l'executer une vaingtaine de fois, vaut mieux mettre un interval tres court, et inversement...

Sinon un bon moyen de mettre tout le monde d'accord, serait de mettre un argument supplementaire...

Exemple:
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function ExecCmd(ByRef vsCmdLine As String, Optional ByRef vsCurrentDirectory As String = vbNullString, Optional byval Time_Out as long) As Long
Dim Proc As PROCESS_INFORMATION
Dim sa As SECURITY_ATTRIBUTES
Dim start As STARTUPINFO

sa.nLength = Len(sa)
sa.bInheritHandle = 1&
sa.lpSecurityDescriptor = 0&

start.cb = Len(start)

If CreateProcessA(0&, vsCmdLine, sa, sa, 1&, NORMAL_PRIORITY_CLASS, 0&, vsCurrentDirectory, start, Proc) Then
if TimeOut > 0 then

Do While WaitForSingleObject(Proc.hProcess, TimeOut) = WAIT_TIMEOUT
DoEvents
Loop
else
WaitForSingleObject Proc.hProcess, &HFFFFFFFF
end if

GetExitCodeProcess Proc.hProcess, ExecCmd

CloseHandle Proc.hThread
CloseHandle Proc.hProcess
Else
ExecCmd = vbError
End If
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Sinon en effet le ShellWait est bien connu sous plusieurs methodes, mais la tienne je n'y avait jamais pense, et c'est la plus "propre" que j'ai vu! donc Bravo!

++
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
2 déc. 2005 à 09:50
Pour le Timeout, je l'ai dit, le choix est arbitraire... 1 seconde, c'est pas mal, je suis d'accord... ca ne va rien mettre en péril, hehe

Merci pour cette précision, Patrice99, je pense que ce genre de code est présent au moins 40 fois sur le Net, je n'ai fait que fournir ma version de la chose, sur VbFrance, la demande étant récurrente - d'où le "esperons qu'elle soit vue" de DarkSidious.

Merci Bidoch78, voilà donc le pourquoi du comment ^^
bidoch78 Messages postés 67 Date d'inscription mercredi 27 février 2002 Statut Membre Dernière intervention 2 décembre 2005
2 déc. 2005 à 09:41
Pour le byval/byref par defaut :
Pour VB6 c'est byref par défaut
Pour VB.NET c'est byval par défaut
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
2 déc. 2005 à 08:35
Voici le meme code avec un timeout (délai max.) possible :
http://patrice.dargenton.free.fr/CodesSources/Snap2Pdf.vbp.html#4
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
2 déc. 2005 à 06:18
Perso, j'aurais mis un timeout un peu plus grand : un time out de 200 ms, ca oblige de tester 5 fois par seconde, ca bouffe des ressources pour pas grand chose, par contre, un timeout de 1000 serait plus raisonnable je pense.

Espèrons que ton code puisse servir (et surtout soit vu) à tout ceux qui posent la question sur le forum !

DarK Sidious
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
1 déc. 2005 à 16:17
pas si vains...

le DoEvents permet juste a l'appli de garder la tête hors de l'eau, et ne pas devenir toute blanche, avec un joli message "[pas de réponse]" dans la barre de titre...

le choix d'utiliser 200 comme TimeOut est lui purement arbitraire.

pour t'en convaincre, met en place la modification que tu propose
et met ce code dans le Form_Load

Private Sub Form_Load()
Me.Show
DoEvents
ExecCmd "Calc.exe"
MsgBox "Calculatrice fermée"
End
End Sub

Lance le programme, et déplace la calculatrice...
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
1 déc. 2005 à 15:58
Salut a tous,

Pas yep pas mal, mais si on part du principe que l'on attend que le processus soit fini, autant mettre seulement:

WaitForSingleObject Proc.hProcess, &HFFFFFFFF

au lieu de faire une boucle:

Do While WaitForSingleObject(Proc.hProcess, 200) = WAIT_TIMEOUT
DoEvents
Loop

Qui selon l'execution que l'on lance, risque de faire des milliers d'appels WaitForSingleObject "inutilement" non ?

Pour info &HFFFFFFFF correspond a INFINITE_TIME_OUT

++
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
1 déc. 2005 à 15:13
j'avais lu le contraire, sans pour autant tester....
rectification très utile! thx
et 10/10 pour le code.
++
PCPT [AFCK]
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
1 déc. 2005 à 15:02
Byref, par défaut, c'est certain...

le test est facile :
Private Sub Form_Load()
Dim b As Integer
b = 1
Incrementer b

MsgBox b
End Sub

Private Sub Incrementer(a As Integer)
a = a + 1
End Sub

affiche 2
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
1 déc. 2005 à 14:57
donc renvoie <> 0 si problème. ok ;)
(je crois bien que c'est ByVal par défaut)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
1 déc. 2005 à 14:39
Byref parce qu'on transmets un String...
(Byval fais une copie, donc légerement plus lourd)

Byref se met par défault, mais là, c'est clair ! ^^

le code de retour est 0 pour la plupart des application : il indique que tout c'est bien passé. Libre a chacun de renvoyer des codes de retour différents...

cas concret :
ExecCmd lance une application, qui fait un traitement sur une base de données.
selon le code de retour, je sais si l'opération s'est bien déroulée, et peut agir en conséquence.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
1 déc. 2005 à 14:23
propre et fonctionnel. nikel

ByRef? pourquoi?
et qu'apporte le retour de ExecCmd puisque fermé à la récupération? (donc 0?!)

(pas noté)
PCPT [AFCK]
Rejoignez-nous