Précédent   Forum du club des développeurs et IT Pro > Autres langages > Général Visual Basic 6 et VBScript > VBScript
VBScript Le forum d'entraide sur VBScript. Avant de poster -> La FAQ VBScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 13/02/2013, 16h08   #1
issoram
Membre chevronné
 
Avatar de issoram
 
Homme Zeco
Développeur informatique
Inscription : janvier 2009
Messages : 504
Détails du profil
Informations personnelles :
Nom : Homme Zeco
Localisation : France, Saône et Loire (Bourgogne)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2009
Messages : 504
Points : 602
Points : 602
Envoyer un message via MSN à issoram
Par défaut Lancement d'un exécutable

Bonjour,

Quelqu'un pourrait-il m’expliquer en détail le code ci dessous (tout ce qu'il y a après la commande Shell).
Je me sers de cette fonction dans VBA Excel pour lancer des exécutables, mais n'étant pas expert en API, j'ai du mal à tout comprendre.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
 
Function Lance_Exe(ByVal Executable As String, Optional ByVal Parametres As String = "") As Boolean
 
    Const SYNCHRONIZE = &H100000
    Const WAIT_TIMEOUT = &H102&
    Const TIMEOUT = 100
 
    Dim RetVal, Handle, PIDexe As Long, retour As Boolean
 
    retour = False
    PIDexe = Shell(Executable & " " & Parametres, vbNormalFocus)
    If PIDexe > 0 Then
        Handle = OpenProcess(SYNCHRONIZE, True, PIDexe)
        Do
            RetVal = WaitForSingleObject(Handle, TIMEOUT)
            If RetVal <> WAIT_TIMEOUT Then Exit Do
            DoEvents
        Loop
        CloseHandle (Handle)
        retour = True
    End If
    Lance_Exe = retour
 
End Function
Dernière chance pour ce message dans ce forum après ceux de VBA Excel et VB6 où il n'a pas eu beaucoup de succès.

Merci d'avance
issoram est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2013, 18h34   #2
omen999
Rédacteur
 
Avatar de omen999
 
Inscription : février 2006
Messages : 903
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 903
Points : 2 242
Points : 2 242
bonjour,
Citation:
pour ce message dans ce forum après ceux de VBA Excel et VB6 où il n'a pas eu beaucoup de succès
rien d'étonnant, le problème relève plutôt de ce sous-forum mais ce n'est pas un souci
ton code vise à rendre la fonction Shell synchrone, c'est à dire que la fonction Lance_Exe ne rendra la main
qu'après la fin de l'exécution du programme désigné la variable Executable
ce problème ne se pose pas en VBS car la fonction Run (équivalent de Shell) possède un paramètre pour régler ce genre de besoin.
il y a un paquet de codes aussi divers que variés sur le net qui propose ce genre de solution.
la solution "officielle" de MS est plus élégante...
__________________
nomen omen, nemo non omen
le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
pas de questions techniques par mp
omen999 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/02/2013, 18h02   #3
issoram
Membre chevronné
 
Avatar de issoram
 
Homme Zeco
Développeur informatique
Inscription : janvier 2009
Messages : 504
Détails du profil
Informations personnelles :
Nom : Homme Zeco
Localisation : France, Saône et Loire (Bourgogne)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2009
Messages : 504
Points : 602
Points : 602
Envoyer un message via MSN à issoram
Désolé pour la réponse tardive mais merci!

Est qu'il serait possible de détailler un peu les étapes :
Code :
1
2
3
4
5
6
7
Handle = OpenProcess(SYNCHRONIZE, True, PIDexe)
Do
      RetVal = WaitForSingleObject(Handle, TIMEOUT)
      If RetVal <> WAIT_TIMEOUT Then Exit Do
      DoEvents
Loop
CloseHandle (Handle)
Bonne soirée.
issoram est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2013, 20h14   #4
omen999
Rédacteur
 
Avatar de omen999
 
Inscription : février 2006
Messages : 903
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 903
Points : 2 242
Points : 2 242
Waitforsingleobject permet de mettre le processus à l'arrêt dans l'attente d'un événement spécifique OU de l'expiration d'un délai précis
Dans ce code on pourrait traduire en pseudo-code par :
BOUCLE AttendreFinProcessusOUFinDelai
Si Pas FinDelai Sortir BOUCLE
EXECUTER MSGS FENETRE (DoEvents)
FIN BOUCLE
__________________
nomen omen, nemo non omen
le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
pas de questions techniques par mp
omen999 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/03/2013, 11h35   #5
issoram
Membre chevronné
 
Avatar de issoram
 
Homme Zeco
Développeur informatique
Inscription : janvier 2009
Messages : 504
Détails du profil
Informations personnelles :
Nom : Homme Zeco
Localisation : France, Saône et Loire (Bourgogne)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2009
Messages : 504
Points : 602
Points : 602
Envoyer un message via MSN à issoram
Merci, c'est beaucoup plus clair maintenant.

Donc si j'ai bien compris: Tant que l'exe (le handle sur l’exécutable) ne change pas d'état (a fini de s’exécuter ou échoue), on boucle. Et on teste si ce changement d'état a lieu pendant 100 ms (TIMEOUT) à chaque fois.

Maintenant, pourquoi faire ça pendant 100ms à chaque fois plutôt que d'attendre simplement le changement d'état?
Code :
WaitForSingleObject(Handle, INFINITE)
Bonne journée.
issoram est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2013, 16h47   #6
omen999
Rédacteur
 
Avatar de omen999
 
Inscription : février 2006
Messages : 903
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 903
Points : 2 242
Points : 2 242
Citation:
Maintenant, pourquoi faire ça pendant 100ms à chaque fois plutôt que d'attendre simplement le changement d'état?
parce qu'un code propre doit toujours éviter de rendre "autiste" le processus dans lequel il s'exécute
la fonction Waitforsingleobject est économique en charge CPU puisqu'il met le proc en mode "idle" mais il bloque aussi le traitement des messages
qui peuvent venir s'accumuler dans la queue
aussi, pour permettre au programme de réagir à des demandes d'autres processus ou de l'utilisateur (annulation de l'action en cours par ex),
il faut lui donner régulièrement le temps de lire et d'exécuter tous ces messages...
c'est le rôle de l'instruction DoEvents
__________________
nomen omen, nemo non omen
le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
pas de questions techniques par mp
omen999 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2013, 16h53   #7
issoram
Membre chevronné
 
Avatar de issoram
 
Homme Zeco
Développeur informatique
Inscription : janvier 2009
Messages : 504
Détails du profil
Informations personnelles :
Nom : Homme Zeco
Localisation : France, Saône et Loire (Bourgogne)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2009
Messages : 504
Points : 602
Points : 602
Envoyer un message via MSN à issoram
Merci pour tous ces éclaircissements Omen.

Bonne fin de journée.
issoram est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h02.


 
 
 
 
Partenaires

Hébergement Web