IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBScript Discussion :

Lancement d'un exécutable


Sujet :

VBScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 665
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    bonjour,
    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 - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    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

  3. #3
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 665
    Par défaut
    Désolé pour la réponse tardive mais merci!

    Est qu'il serait possible de détailler un peu les étapes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    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 - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    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

  5. #5
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 665
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    WaitForSingleObject(Handle, INFINITE)
    Bonne journée.

  6. #6
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    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 - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Compiler] Erreur lors du lancement d'un exécutable
    Par VinceDA dans le forum MATLAB
    Réponses: 6
    Dernier message: 04/06/2007, 16h11
  2. Réponses: 6
    Dernier message: 16/04/2007, 19h05
  3. [Système] lancement d'un exécutable
    Par Benjamin_es dans le forum Langage
    Réponses: 14
    Dernier message: 19/03/2007, 15h58
  4. [Système] Lancement d'un exécutable avec PHP
    Par fdu63 dans le forum Langage
    Réponses: 5
    Dernier message: 02/08/2006, 10h00
  5. Lancement d'un exécutable
    Par devl83 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/10/2005, 11h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo