promiage123
Messages postés14Date d'inscriptionsamedi 15 octobre 2005StatutMembreDernière intervention23 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 24 juin 2007 à 15:55
Tout à fait cela, fonce.
promiage123
Messages postés14Date d'inscriptionsamedi 15 octobre 2005StatutMembreDernière intervention23 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és10Date d'inscriptiondimanche 17 septembre 2006StatutMembreDernière intervention24 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 15 mars 2006 à 11:56
c'est sensé être autorisé, mais ne fonctionne effectivement pas...
bouv
Messages postés1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 15 mars 2006 à 11:11
pourquoi posez vous vos question ici, et pas sur le Forum, au fait .. ??
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és5Date d'inscriptionvendredi 30 décembre 2005StatutMembreDernière intervention15 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 23 janv. 2006 à 12:24
Fuite mémoire
Derrière GetExitCodeProcess, il manque:
CloseHandle tShellExInfo.hProcess
bouv
Messages postés1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 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és1221Date d'inscriptionjeudi 23 août 2001StatutMembreDerniè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és1221Date d'inscriptionjeudi 23 août 2001StatutMembreDerniè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és1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 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és1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 20 déc. 2005 à 17:41
Trop classe. Merci Renfield... :-)
draluorg
Messages postés625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 novembre 2010 20 déc. 2005 à 17:40
Re,
Encore mieux bravo Renfield ;)
++
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 20 déc. 2005 à 17:35
code refondu....
possibilité de faire simplement :
ExecCmd App.Path & "\MonDocument.doc"
draluorg
Messages postés625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 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és1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 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és1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 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 :
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és1221Date d'inscriptionjeudi 23 août 2001StatutMembreDerniè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és1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 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 :
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 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
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és67Date d'inscriptionmercredi 27 février 2002StatutMembreDerniè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és1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 2 déc. 2005 à 08:35
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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?!)
17 nov. 2009 à 15:34
rien à redire, fonctionne du premier coup
10 mars 2009 à 14:13
Merci Renfield !
25 juil. 2007 à 10:23
Merci.
25 juin 2007 à 10:03
if ExecCmd ("c:\monapplication.exe", "-x -y") = 0 then
24 juin 2007 à 16:17
24 juin 2007 à 16:02
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") ??
24 juin 2007 à 15:55
24 juin 2007 à 15:52
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
21 oct. 2006 à 13:21
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.
15 mars 2006 à 11:56
15 mars 2006 à 11:39
Sinon Mailto ne permet pas d'ajouter de piece jointes (à ma connaissance).
15 mars 2006 à 11:11
15 mars 2006 à 11:09
pour ta dll, je pense qu'il faut regarder du coté de Rundll32.exe
15 mars 2006 à 09:50
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
15 mars 2006 à 09:34
que cherches tu a faire ?
(pour lancer un programme depuis VB, au choix, Shell, ou l'API ShellExecute)
15 mars 2006 à 09:25
23 janv. 2006 à 14:34
le nom du flag de SHELLEXECUTEINFOA ( SEE_MASK_NOCLOSEPROCESS) a pourtant un nom qui aurait du me faire tilter plus tôt
Merci BruNews
23 janv. 2006 à 14:21
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.
23 janv. 2006 à 13:33
23 janv. 2006 à 13:19
donc, systématiquement, ShellExecuteEx -> CloseHandle ??
23 janv. 2006 à 13:00
Tu pourrais vouloir faire un OpenProcess avec le handle ou que sais-je encore, tout est envisageable.
23 janv. 2006 à 12:32
Qu'est-ce qui fait qu'il faille appeler le CloseHandle nous même ?
23 janv. 2006 à 12:24
Derrière GetExitCodeProcess, il manque:
CloseHandle tShellExInfo.hProcess
21 déc. 2005 à 12:00
Merci
Bonne prog
++
21 déc. 2005 à 09:54
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 ^^
21 déc. 2005 à 09:40
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.
21 déc. 2005 à 08:28
21 déc. 2005 à 08:25
20 déc. 2005 à 18:02
PS : Je suis sous Acrobat 5 (pas le Reader).
20 déc. 2005 à 17:41
20 déc. 2005 à 17:40
Encore mieux bravo Renfield ;)
++
20 déc. 2005 à 17:35
possibilité de faire simplement :
ExecCmd App.Path & "\MonDocument.doc"
20 déc. 2005 à 16:45
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...
++
20 déc. 2005 à 16:37
Et le Me.Enable = True n'a rien à faire là...
20 déc. 2005 à 16:34
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 ?
20 déc. 2005 à 16:14
C'est tout à fait normal, et ta solution est bonne.
20 déc. 2005 à 16:08
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
2 déc. 2005 à 11:58
2 déc. 2005 à 11:39
---------------------------------------------------------------
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!
++
2 déc. 2005 à 09:50
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 ^^
2 déc. 2005 à 09:41
Pour VB6 c'est byref par défaut
Pour VB.NET c'est byval par défaut
2 déc. 2005 à 08:35
http://patrice.dargenton.free.fr/CodesSources/Snap2Pdf.vbp.html#4
2 déc. 2005 à 06:18
Espèrons que ton code puisse servir (et surtout soit vu) à tout ceux qui posent la question sur le forum !
DarK Sidious
1 déc. 2005 à 16:17
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...
1 déc. 2005 à 15:58
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
++
1 déc. 2005 à 15:13
rectification très utile! thx
et 10/10 pour le code.
++
PCPT [AFCK]
1 déc. 2005 à 15:02
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
1 déc. 2005 à 14:57
(je crois bien que c'est ByVal par défaut)
1 déc. 2005 à 14:39
(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.
1 déc. 2005 à 14:23
ByRef? pourquoi?
et qu'apporte le retour de ExecCmd puisque fermé à la récupération? (donc 0?!)
(pas noté)
PCPT [AFCK]