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

VB 6 et antérieur Discussion :

Attendre fin d'exécution d'un processus sous vb6


Sujet :

VB 6 et antérieur

  1. #1
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 68
    Points : 40
    Points
    40
    Par défaut Attendre fin d'exécution d'un processus sous vb6
    Bonjour,

    J'essaye de lancer un exe à partir d'une appli VB6, et faire en sorte que l'application continue à s'exécuter qu'une fois l'exe lancé est terminé.

    J'utilse pour cela la fonction CreatProcess
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
    jusque la il n'y a aucun problème, sauf que mon application ne marche plus dans les postes XP (l'exécution continue avant la fin de l'exe).

    je me demande s'il ne s'agit pas la d'une incompatibilité de la méthode creatProcess avec XP, et si c'est le cas, y aurait-il un moyen pour contourner ce problème.

    merci beaucoup

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 730
    Points : 876
    Points
    876
    Par défaut
    Bonjour,

    essaye d'être plus clair, je ne comprends pas :

    Citation Envoyé par dev-man Voir le message
    Bonjour,
    l'application continue à s'exécuter qu'une fois l'exe lancé est terminé.
    ou

    Citation Envoyé par dev-man Voir le message
    (l'exécution continue avant la fin de l'exe).

  3. #3
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    finalement la fonction CreateProcess fonctionne aussi sous xp. en procédant comme suit:
    1-déclarations
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _
                                          (ByVal lpApplicationName As Long, 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 Long, _
                                           lpStartupInfo As STARTUPINFO, _
                                           lpProcessInformation As PROCESS_INFORMATION) As Long
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
     
    Enum enSW
        SW_HIDE = 0
        SW_NORMAL = 1
        SW_MAXIMIZE = 3
        SW_MINIMIZE = 6
    End Enum
     
     
    'Type pour gérer les lancements de processus
    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
     
    'Info sur un processus
    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 STILL_ACTIVE = &H103&
    2-implémentation
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    Public Sub AttendreFinProcess(proc As PROCESS_INFORMATION, Optional timeout As Long = 60)
     
    Dim Ret As Long
    Dim tms As Single
    Dim exitcode As Long
     
    'Attendre la fin de la commande
    tms = Timer
    Ret = GetExitCodeProcess(proc.hProcess, exitcode)
    Do While Ret <> 0 And exitcode = STILL_ACTIVE
        Ret = GetExitCodeProcess(proc.hProcess, exitcode)
        DoEvents
        Sleep 100
        If Timer - tms > timeout Then
            Err.Raise STILL_ACTIVE, "AttendreFinProcess", "Timeout sur l'attente de la fin d'un process"
        End If
    Loop
    If Ret = 0 Then
        Err.Raise Err.LastDllError, "AttendreFinProcess", "Erreur systeme N° " & Err.LastDllError
    End If
     
    End Sub
     
    Public Sub LancerProcess(sExe As String, proc As PROCESS_INFORMATION, ByVal StartSize As enSW)
     
    Dim start As STARTUPINFO
    Dim Ret As Long
     
    'StartupInfo pour le processus qui lancera la commande
    start.cb = Len(start)
    start.dwFlags = &H1 'l'exe tourne en tâche de fond
    start.wShowWindow = StartSize
    'Lancement de la commande
    Ret& = CreateProcess(0&, sExe, 0&, 0&, 0&, NORMAL_PRIORITY_CLASS, 0&, 0, start, proc)
    If Ret = 0 Then
        Err.Raise Err.LastDllError, "LancerProcess", "Erreur systeme N° " & Err.LastDllError
    End If
     
    End Sub
    3- appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Dim proc As PROCESS_INFORMATION
        proc.hProcess = -1
        proc.hThread = -1
     
        Call LancerProcess(cheminExe, proc, SW_HIDE)
        Call AttendreFinProcess(proc)
     
        Call CloseHandle(proc.hProcess)
        Call CloseHandle(proc.hThread)
    Ce code permettre d'exécuter le programme cheminExe à partir de votre application VB6, en arrêtant cette dernière jusqu'à la fin de l'exécution de cheminExe.

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

Discussions similaires

  1. Exécuter un script perl sous vb6
    Par M E H D I dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/05/2010, 17h06
  2. détecter la fin d'exécution d'un processus
    Par d_hazem dans le forum Général Java
    Réponses: 5
    Dernier message: 30/01/2009, 09h52
  3. [Vista]Comment attendre la fin d'exécution d'un processus ?
    Par gb_68 dans le forum Threads & Processus
    Réponses: 9
    Dernier message: 15/06/2007, 23h17
  4. Attendre la fin d'exécution d'un page en JS
    Par TekP@f dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/08/2005, 15h15
  5. [MFC] attendre fin de demarrage d'un processus
    Par pitch21 dans le forum MFC
    Réponses: 16
    Dernier message: 14/10/2004, 09h35

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