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

Catégorie :API Classé sous : shell, wait, attendre, shellandwait, shellexecuteex Niveau : Débutant Date de création : 01/12/2005 Date de mise à jour : 25/06/2007 10:02:23 Vu / téléchargé: 16 602 / 1 637

Note :
9,9 / 10 - par 10 personnes
9,90 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (48)
Ajouter un commentaire et/ou une note


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

Commentaires et avis

signaler à un administrateur
Commentaire de PCPT le 01/12/2005 14:23:07 administrateur CS

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]

signaler à un administrateur
Commentaire de Renfield le 01/12/2005 14:39:18 administrateur CS

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.

signaler à un administrateur
Commentaire de PCPT le 01/12/2005 14:57:17 administrateur CS

donc renvoie <> 0 si problème. ok ;)
(je crois bien que c'est ByVal par défaut)

signaler à un administrateur
Commentaire de Renfield le 01/12/2005 15:02:50 administrateur CS

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

signaler à un administrateur
Commentaire de PCPT le 01/12/2005 15:13:50 administrateur CS

j'avais lu le contraire, sans pour autant tester....
rectification très utile! thx
et 10/10 pour le code.
++
PCPT   [AFCK]

signaler à un administrateur
Commentaire de draluorg le 01/12/2005 15:58:14

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

++

signaler à un administrateur
Commentaire de Renfield le 01/12/2005 16:17:07 administrateur CS

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...

signaler à un administrateur
Commentaire de DARKSIDIOUS le 02/12/2005 06:18:32 administrateur CS

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

signaler à un administrateur
Commentaire de Patrice99 le 02/12/2005 08:35:36

Voici le meme code avec un timeout (délai max.) possible :
http://patrice.dargenton.free.fr/CodesSources/Snap2Pdf.vbp.html#4

signaler à un administrateur
Commentaire de bidoch78 le 02/12/2005 09:41:45

Pour le byval/byref par defaut :
Pour VB6 c'est byref par défaut
Pour VB.NET c'est byval par défaut

signaler à un administrateur
Commentaire de Renfield le 02/12/2005 09:50:09 administrateur CS

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 ^^

signaler à un administrateur
Commentaire de draluorg le 02/12/2005 11:39:23

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!

++

signaler à un administrateur
Commentaire de Renfield le 02/12/2005 11:58:32 administrateur CS

j'acquiesce et j'ai mis a jour le code, rendant parametrable cette durée du TimeOut

signaler à un administrateur
Commentaire de bouv le 20/12/2005 16:08:46

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

signaler à un administrateur
Commentaire de Patrice99 le 20/12/2005 16:14:47

> Mais le reste de la feuille est utilisable

C'est tout à fait normal, et ta solution est bonne.

signaler à un administrateur
Commentaire de bouv le 20/12/2005 16:34:55

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 ?

signaler à un administrateur
Commentaire de bouv le 20/12/2005 16:37:14

Au fait sArchive est le chemin de mon fichier à lancé
Et le Me.Enable = True n'a rien à faire là...

signaler à un administrateur
Commentaire de draluorg le 20/12/2005 16:45:33

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...

++

signaler à un administrateur
Commentaire de Renfield le 20/12/2005 17:35:17 administrateur CS

code refondu....

possibilité de faire simplement :

ExecCmd App.Path & "\MonDocument.doc"

signaler à un administrateur
Commentaire de draluorg le 20/12/2005 17:40:02

Re,

Encore mieux bravo Renfield ;)

++

signaler à un administrateur
Commentaire de bouv le 20/12/2005 17:41:55

Trop classe. Merci Renfield... :-)

signaler à un administrateur
Commentaire de bouv le 20/12/2005 18:02:21

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).

signaler à un administrateur
Commentaire de Patrice99 le 21/12/2005 08:25:50

Essaie de passer la valeur vbNormalFocus (et non vbHide) pour le paramètre vnShowCmd

signaler à un administrateur
Commentaire de Patrice99 le 21/12/2005 08:28:44

Pour un fichier Pdf, je ne vois pas pourquoi tu voudrais attendre la fin, dans ce cas un simple Shell suffit.

signaler à un administrateur
Commentaire de bouv le 21/12/2005 09:40:55

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.

signaler à un administrateur
Commentaire de Renfield le 21/12/2005 09:54:29 administrateur CS

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 ^^

signaler à un administrateur
Commentaire de bouv le 21/12/2005 12:00:37

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
++

signaler à un administrateur
Commentaire de BruNews le 23/01/2006 12:24:08 administrateur CS

Fuite mémoire
Derrière GetExitCodeProcess, il manque:
CloseHandle tShellExInfo.hProcess

signaler à un administrateur
Commentaire de Renfield le 23/01/2006 12:32:07 administrateur CS

Ah... Merci pour l'info...

Qu'est-ce qui fait qu'il faille appeler le CloseHandle nous même ?

signaler à un administrateur
Commentaire de BruNews le 23/01/2006 13:00:22 administrateur CS

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.

signaler à un administrateur
Commentaire de Renfield le 23/01/2006 13:19:19 administrateur CS

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 ??

signaler à un administrateur
Commentaire de BruNews le 23/01/2006 13:33:19 administrateur CS

ShellExecuteEx ne renvoie pas systématiquement un handle (voir membre fMask dans MSDN), seulement dans ce cas.

signaler à un administrateur
Commentaire de Renfield le 23/01/2006 14:21:53 administrateur CS

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.

signaler à un administrateur
Commentaire de Renfield le 23/01/2006 14:34:58 administrateur CS

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

signaler à un administrateur
Commentaire de sofhak le 15/03/2006 09:25:55

urgent: je veux savoir comment lançer une application externe a pa partir de vb en arriere plan

signaler à un administrateur
Commentaire de Renfield le 15/03/2006 09:34:12 administrateur CS

le forum est là pour ça...
que cherches tu a faire ?

(pour lancer un programme depuis VB, au choix, Shell, ou l'API ShellExecute)

signaler à un administrateur
Commentaire de bouv le 15/03/2006 09:50:03

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

signaler à un administrateur
Commentaire de Renfield le 15/03/2006 11:09:06 administrateur CS

tu peux toujours utiliser Mailto...

pour ta dll, je pense qu'il faut regarder du coté de Rundll32.exe

signaler à un administrateur
Commentaire de Renfield le 15/03/2006 11:11:12 administrateur CS

pourquoi posez vous vos question ici, et pas sur le Forum, au fait .. ??

signaler à un administrateur
Commentaire de bouv le 15/03/2006 11:39:04

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).

signaler à un administrateur
Commentaire de Renfield le 15/03/2006 11:56:28 administrateur CS

c'est sensé être autorisé, mais ne fonctionne effectivement pas...

signaler à un administrateur
Commentaire de lucgod1 le 21/10/2006 13:21:09

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.

signaler à un administrateur
Commentaire de promiage123 le 24/06/2007 15:52:43

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

signaler à un administrateur
Commentaire de BruNews le 24/06/2007 15:55:58 administrateur CS

Tout à fait cela, fonce.

signaler à un administrateur
Commentaire de promiage123 le 24/06/2007 16:02:04

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") ??

signaler à un administrateur
Commentaire de PCPT le 24/06/2007 16:17:25 administrateur CS

http://www.vbfrance.com/infomsg_REDIRECTION-VB_969001.aspx#1

signaler à un administrateur
Commentaire de Renfield le 25/06/2007 10:03:29 administrateur CS

il s'agit du parametre nommé 'vsParameters' :

if ExecCmd ("c:\monapplication.exe", "-x -y") = 0 then

signaler à un administrateur
Commentaire de PROTEUS91 le 25/07/2007 10:23:39

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.

Ajouter un commentaire

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&#224;. j'ouvre une instance d'IE par Shell. je r&#233;cup&#232;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


Nos sponsors

Sondage...