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.NET Discussion :

Attendre la fin d'exécution d'un programme .EXE sous CMD puis retour en Visual Basic 2015


Sujet :

VB.NET

  1. #1
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 305
    Points : 181
    Points
    181
    Par défaut Attendre la fin d'exécution d'un programme .EXE sous CMD puis retour en Visual Basic 2015
    Bonjour,

    Je converti un programme VB6 en VB 2015.

    Le but est d'attendre la fin d'exécution d'un .exe lancé avec la fonction EexcCmd

    En VB6 ce petit programme fonctionne parfaitement :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
      Private 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
     
       Private Type PROCESS_INFORMATION
          hProcess As Long
          hThread As Long
          dwProcessID As Long
          dwThreadID As Long
       End Type
     
       Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _
          hHandle As Long, ByVal dwMilliseconds As Long) As Long
     
       Private 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
     
       Private Declare Function CloseHandle Lib "kernel32" _
          (ByVal hObject As Long) As Long
     
       Private Declare Function GetExitCodeProcess Lib "kernel32" _
          (ByVal hProcess As Long, lpExitCode As Long) As Long
     
       Private Const NORMAL_PRIORITY_CLASS = &H20&
       Private Const INFINITE = -1&
     
       Public Function ExecCmd(cmdline$)
          Dim proc As PROCESS_INFORMATION
          Dim start As STARTUPINFO
     
          ' Initialize the STARTUPINFO structure:
          start.cb = Len(start)
     
          ' Start the shelled application:
          ret& = CreateProcessA(vbNullString, cmdline$, 0&, 0&, 1&, _
             NORMAL_PRIORITY_CLASS, 0&, vbNullString, start, proc)
     
          ' Wait for the shelled application to finish:
             ret& = WaitForSingleObject(proc.hProcess, INFINITE)
             Call GetExitCodeProcess(proc.hProcess, ret&)
             Call CloseHandle(proc.hThread)
             Call CloseHandle(proc.hProcess)
             ExecCmd = ret&
       End Function
     
       Sub Form_Click()
          Dim retval As Long
          retval = ExecCmd("notepad.exe")
          MsgBox "Process Finished, Exit Code " & retval
       End Sub
    La conversion en VB 2015 ne pose pas de problème pour Type STARTUPINFO et PROCESS_INFORMATION:

    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
    Option Explicit On
    Imports System.IO
    Imports System.Text
    Imports System.Threading
     
     
    Public Structure STARTUPINFO
        Dim CB As Long
        Dim lpReserved, lpDesktop, lpTitle As String
        Dim dwX, dwy, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags, wShowWindow, cbReserved2, lpReserved2, hStdInput, hStdOutput, hStdError As Long
    End Structure
     
    Public Structure PROCESS_INFORMATION
        Dim hProcess, hThread, dwProcessId, dwThreadID As Long
    End Structure
    Le problème se pose pour convertir depuis VB6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _
          hHandle As Long, ByVal dwMilliseconds As Long) As Long
    car la syntaxe ne semble pas la bonne en VB 2015. J'ai l'erreur au débogage : "Instruction non valide dans un espace de noms". Même problème pour les Declare Function suivants.

    J'ai du mal à comprendre les explications MSDN : https://msdn.microsoft.com/fr-fr/library/3w4tctcf.aspx

    Que faut-il valider dans l'espace de noms importés ?

    D'autre part à la lecture de la définition de Declare en VB 2015 il semble qu'il faille ajouter Alias "<alias>" avant la liste d'argument. OK sur le principe mais que mettre dans "<alias>" ?

    Autre piste PROCESS.START avec p=Process.Start et if p.HasExited then ... Mais là la littérature est assez muette ! Je ne trouve pas d'exemple concret sur la toile ...

    En vous remerciant pour votre aide.

    Bon dimanche.
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  2. #2
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 305
    Points : 181
    Points
    181
    Par défaut La solution : wait = true
    La solution est finalement très simple dans VB 2010, 2012 et suivants. Inutile de retranscrire le projet VB6 précédent => un seul paramètre Wait à mettre à True dans le Shell.

    Consulter : Interaction.Shell méthode (String, AppWinStyle, Boolean, Int32) dans

    https://msdn.microsoft.com/fr-fr/lib...code-snippet-1

    Par défaut, le Shell fonction exécute le programme de façon asynchrone. Cela signifie qu’un programme lancé par le Shell (fonction) ne peut pas s’exécuter complètement avant les instructions qui suivent le Shell (fonction) sont exécutées. Si vous souhaitez attendre pour le programme se termine avant de continuer, définissez Wait à True.
    quelques exemples d'écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Shell("C:\Program Files\Notepad++\notepad++.exe", , True)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ID = Shell("""C:\Program Files\display.exe"" -a -q", , True, 100000)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Shell("c:\sbwin\py479usr\pywin64.exe -maxmem 4096000 " + "c:\sbwin\hninp.txt", , True)
    Ne pas oublier les deux virgules avant True.

    Espérant que cela rendra bien service.

    Bon Dimanche
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Inutile de retranscrire le projet VB6 précédent => un seul paramètre Wait à mettre à True dans le Shell.
    Effectivement il est possible de faire du Vb6 en adaptant légèrement le code! Mais cela reste du Vb6 pas du Vb.net!
    Mais il faut en être conscient mais pourquoi pas!

    En activant par défaut la librairie visual basic, Microsoft nous fait croire que vb6 et vb.net c'est la même chose ce qui discrédite vb.net
    L'instructions shell par exemple c'est du Vb6 pas du Vb.net!

    Voila ce qu'on trouve dans ton lien!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim procID As Integer
    Dim newProc As Diagnostics.Process
    newProc = Diagnostics.Process.Start("C:\WINDOWS\NOTEPAD.EXE")
    procID = newProc.Id
    newProc.WaitForExit()
    Dim procEC As Integer = -1
    Si tu décoches la librairie visual basic de ton projet, le programme explose!
    Dernière modification par Invité ; 11/12/2017 à 09h08.

  4. #4
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 305
    Points : 181
    Points
    181
    Par défaut
    Bonsoir

    Merci dysorthographie pour ton analyse! Il est vrai que VB.net est bien plus performant que VB6 heureusement ! Quoique en matière d'animation de mouvements d'images il y a beaucoup à dire mais j'ai fini par trouver des astuces.

    Je vais tester ton exemple et je vais voir comment l'intégrer avec un format imposé de la fenêtre 'CMD" + couleur de fond et de caractères différent du noir et blanc.

    A+
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  5. #5
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 305
    Points : 181
    Points
    181
    Par défaut
    Bonjour

    Génial le programme suivant fonctionne bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim procID As Integer
    Dim newProc As Diagnostics.Process
    newProc = Diagnostics.Process.Start("C:\WINDOWS\NOTEPAD.EXE")
    procID = newProc.Id
    newProc.WaitForExit()
    Dim procEC As Integer = -1
    par contre là ou ça se corse :

    en VB.net ceci fonctionne très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Shell("c:\pywin64.exe " + "-maxmem 4096000 " + "c:\hninp.txt", AppWinStyle.NormalFocus, True)
    mais ceci ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     newProc = Diagnostics.Process.Start("c:\pywin64.exe" + " -maxmem 4096000 " + "c:\hninp.txt")
    Petite explication : pywin64.exe reçoit l'info de calculer avec 4MB de mémoire et à besoin de "manger" avec le contenu de datas de hninp.txt et le résultat fini sur un autre fichier

    Ce programme est la solution 'VB.net' avec les arguments :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim ProcessProperties As New ProcessStartInfo
            ProcessProperties.FileName = "c:\sbwin\py479usr\pywin64.exe"
            ProcessProperties.Arguments = " -maxmem 4096000 c:\sbwin\hninp.txt"
            ProcessProperties.WindowStyle = ProcessWindowStyle.Normal
            Dim myProcess As Process = Process.Start(ProcessProperties)
    Donc pb résolu.

    Reste une question : Comment par programme modifier la couleur du fond et de l'écriture, la position et la taille de la fenêtre du programme CMD.exe par exemple ?

    Par exemple : Lancer CMD avec la comande Windows. La fenêtre de cmd.exe s'ouvre. Placer le curseur de la souris sur la barre supérieure, cliquer droit et cliquer sur Propriétés. Cette fonction permet entre autre d'inposer une position fixe , la taille, la couleur du fond et celle des lettres.

    Je voudrais obtenir le même résultat par programme. Comment faire?

    Merci pour vos idées.
    La Connaissance est comme le rire elle est contagieuse en la partageant!

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

Discussions similaires

  1. Attendre la fin d'exécution d'un programme
    Par DelphiCool dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 03/02/2013, 10h42
  2. Fin d'exécution d'un programme java
    Par abcazerty dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 19/03/2011, 15h25
  3. Réponses: 3
    Dernier message: 03/01/2009, 20h56
  4. [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
  5. 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

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