fred2567
Messages postés42Date d'inscriptionmardi 1 août 2006StatutMembreDernière intervention31 janvier 2008
-
5 déc. 2007 à 09:02
fred2567
Messages postés42Date d'inscriptionmardi 1 août 2006StatutMembreDernière intervention31 janvier 2008
-
5 déc. 2007 à 12:54
Bonjour,
donc voila j'ai une application en vba qui permet de gérer l'adressage ip de la machine,
or lorsque j'utilise mes commandes avec shell j'ai l'impression que la première finie les autres ne sont pas prises en comptes
donc j'ailmerai passer plusieurs commandes dans un shell .
pneau
Messages postés258Date d'inscriptionmercredi 21 avril 2004StatutMembreDernière intervention27 octobre 20105 5 déc. 2007 à 09:42
salut
tu exécutes la commande Shell c'est bien cela ?
le pb de cette commande c'est qu'elle va rendre la main à l'application appellante aussitot, sans attendre la fin de l'exécution
ce qui fait que tes commandes suivantes vont être lancées aussitot.
donc si elles ont besoin des éléments du résultat de la premiere instruction, il se peut que celle ci ne soit pas terminée donc on a l'impression qu'elles ne se font pas.
ex :
si je fais
shell ("Dir C:\*.* /s > c:\result.txt")
Shell ("Copy C:\result.txt c:\savresult.txt")
les 2 instructions vont être exécutées à la suite... la seconde (qui dépend du résultat de la premiere) va être exécutée alors que la premiere n'est peut être pas terminée.
par contre, tu ne vas pas pouvoir mettre les 2 instructions ensemble dans le shell.
le mieux est de lancer tes commandes shell avec la fonction suivante... (par contre, je ne l'ai pas testée en VBA)
Public Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Public Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type
Public Const NORMAL_PRIORITY_CLASS = &H20&
Public Const INFINITE = -1&
Public Const CREATE_NO_WINDOW = &H8000000
Public Declare Function WaitForSingleObject Lib "KERNEL32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CreateProcessA Lib "KERNEL32" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Public Declare Function CloseHandle Lib "KERNEL32" (ByVal hObject As Long) As Long
Public Declare Function GetExitCodeProcess Lib "KERNEL32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Public Function ExecCmd(CmdLine As String) As Long
Dim lretour As Long
'Procédure qui permet de lancer une commande (équivalent au shell)
'mais ne rend la main que lorsque cette commande est terminée
Dim proc As PROCESS_INFORMATION
Dim start As STARTUPINFO
Dim ReturnValue As Integer
' Initialisation
start.cb = Len(start)
' Lancement de la commande
ReturnValue = CreateProcessA(vbNullString, CmdLine, 0, 0, 1, NORMAL_PRIORITY_CLASS + CREATE_NO_WINDOW, 0, vbNullString, start, proc)
' Attente que l'exécution de la commande se termine
'Do
ReturnValue = WaitForSingleObject(proc.hProcess, INFINITE)
' DoEvents
'Loop Until ReturnValue <> 258
lretour = GetExitCodeProcess(proc.hProcess, lCodeRetour)
ReturnValue = CloseHandle(proc.hProcess)
ExecCmd = lCodeRetour
End Function
en espérant t'avoir aidé un peu...
cordialement
Pat
Don't Worry , Be Happy
<hr />
lorsque le problème est résolu, pensez Réponse Acceptée
pneau
Messages postés258Date d'inscriptionmercredi 21 avril 2004StatutMembreDernière intervention27 octobre 20105 5 déc. 2007 à 11:17
excuses, j'ai fait un copié collé sans tout prendre dans mon code...
NOn, returnValue contient la valeur de résultat de la fonction exécutée
lcoderetour permet de récupérer le code de sortie de l'application appellée.
si tu n'attends aucun code de sortie particulier, tu n'en n'as pas besoin.
n'hésites pas si besoin...
@+
Pat