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 :

Commande Shell, et ses retours


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Par défaut Commande Shell, et ses retours
    Bonjour,

    Je fais mes premiers essais en vb 2010 (et vb tout court !) , aussi vais-je essayer d'être assez clair ...

    Dans un Form, je lance un exe via une commande shell. Le code du form attend que ce programme se termine. Ensuite, j'aimerais que le code enchaîne sur l'affichage d'un textbox et d'un button.

    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
     
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
     
     
            On Error GoTo erreur1
             Dim VarShellTest As String
     
            VarShellTest = Shell("C:\Program Files\CCleaner\ccleaner.exe", AppWinStyle.NormalFocus, True, 120)
            Label9.Visible = True
            TextBox1.Visible = True
            Label10.Visible = True
            TextBox2.Visible = True
            If VarShellTest > 0 Then
                TextBox1.Text = Now
                TextBox2.Text = "ici mes notes ... : "
            End If
            Teste_Programme(VarShellTest)
     
            Exit Sub
     
     
     
     
     
    erreur1:
            MsgBox("Impossible de contacter le serveur", vbCritical, "Erreur de connexion")
        End Sub
    Pour toute la première partie, ça fonctionne. En revanche, là où je sèche, c'est pour identifier le processus lancé, et comment déterminer s'il a été fermé, pour pouvoir afficher ensuite les infos complémentaires ...

    J'ai essayé avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oFoundProcess = System.Diagnostics.Process.GetProcessById(VarShellTest)
    Mais je ne sais pas comment articuler la chose, et encore moins si un tel enchaînement est possible.

    En espérant que vous pourrez m'apporter votre aide et quelques pistes ...

    Merci d'avance !!

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    utilises system.diagnotics.process à la place de shell, tu as un évènement pour la fin du processus
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Par défaut
    Merci Pol63 pour cette piste.

    J'ai pu progresser un peu, et cela fonctionne si je lance un exe "classique" comme notepad ou ccleaner.

    En revanche, je lance teamviewer, et il semble lancer lui-mêmeun process interne (pas un nouveau process). Du coup, mon code reçoit bien une fin, et continue.

    Voici la partie de code concerné :

    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
     
    Try
                processInfo = New ProcessStartInfo("C:\Program Files\TeamViewer\Version5\teamviewer.exe")
                processInfo.WindowStyle = ProcessWindowStyle.Normal
                processInfo.Arguments = "-i " & posid & " --Password " & posmdp
                monproc = Process.Start(processInfo)
     
                ' Boucle tant que le processus n'est pas terminé
                While Not (monproc.HasExited)
                    monproc.WaitForExit()
                End While
     
            Catch ex As Exception
                MsgBox("Impossible de lancer le programme" & vbCrLf & ex.Message)
            End Try
     
            Label11.Visible = True
            TextBox3.Text = Now
            TextBox3.Visible = True
            Button5.Visible = True
            TextBox2.Focus()
    Est-ce qu'il y a un moyen de gérer cela ?

    Merci d'avance ...

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    il faudrait trouver le nom de ce processus le rechercher et s'abonner à l'event de celui là
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Par défaut
    Merci pour l'info. j'ai fait beaucoup de recherches sur le web, et dois bien reconnaître que là, je suis largué ...

    Je connais le processus, mais je ne sais comment m'y abonner ...

    Aurais-tu un petit boute de piste pour moi ?

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    process.getprocessbyname je pense
    ou si ca n'existe pas faire un for each sur process.getprocesses()
    et une fois que tu as trouvé celui que tu veux tu addhandler dessus
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Par défaut
    alors ...

    Je trouve bien le processus, et je pose un handhle dessus, sur l'évènement "exited" ...

    Mais quand je ferme le programme, je ne passe pas par la méthode indiquée ...

    Bon, j'ai déjà eu du mal à faire ce tout petit bout de machin, et le code n'est certainement pas très propre ...

    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
     
            Try
     
                processInfo = New ProcessStartInfo("notepad.exe")
                processInfo.WindowStyle = ProcessWindowStyle.Minimized
     
                monproc = Process.Start(processInfo)
     
                Dim ProcessList As System.Diagnostics.Process()
                Dim Proc As System.Diagnostics.Process
                ProcessList = System.Diagnostics.Process.GetProcesses()
     
                For Each Proc In ProcessList
                    If (Proc.ProcessName = "notepad") Then
                        MsgBox(Proc.ProcessName)
     
                        AddHandler System.Diagnostics.Process.GetCurrentProcess.Exited, AddressOf monProcend
                        MsgBox("handle ajouté")
                        monproc.WaitForExit()
                    End If
                Next
     
               Catch ex As Exception
                MsgBox("Impossible de lancer notepad" & vbCrLf & ex.Message)
            End Try
    Et voici la méthode toute simple (trop ?) appelée ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Sub monProcend()
            MsgBox("Fermeture de notepad")
        End Sub
    Si j'ai bien compris le cheminement ...

    Je lance un processus. Je le trouve, j'y ajoute un handler. Le handler surveille la sortie du processus lancé. Si cette sortie est effective, cela devrait afficher la msgbox de la méthode appelée, puis continer le code de mon form.

    C'est bien ça ?

    Je suppose que soit mon handler est mal posé et/ou que la méthode n'est jamais appelée ...

    merci pour votre patience

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddHandler System.Diagnostics.Process.GetCurrentProcess.Exited, AddressOf monProcend

    ca serait pas plutot

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddHandler Proc.Exited, AddressOf monProcend

    ???
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Par défaut
    Merci pour ta réponse rapide, et ta présence active !

    Hélas non :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddHandler Proc.Exited, AddressOf monProcend
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddHandler System.Diagnostics.Process.GetCurrentProcess.Exited, AddressOf monProcend
    donnent le même résultat. Je ne passe pas par la méthode monProcend ...

  10. #10
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    en effet l'event n'est pas déclenché ...

    il reste une solution, soit avec un timer, soit un thread qui boucle avec un léger sleep et tester if leprocessus.hasexited then
    je viens de tester ca marche
    (ne pas rehercher le processus à chaque fois dans la liste, le garder en référence dans une variable)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. [Système]Execution d'une commande shell
    Par n8ken dans le forum API standards et tierces
    Réponses: 24
    Dernier message: 29/03/2007, 05h36
  2. []Commande shell
    Par phoenix736 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 09/10/2005, 21h31
  3. [Debutant] Commande shell
    Par drosophile dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 21/04/2005, 16h06
  4. commande shell dans un programme
    Par diefo dans le forum C
    Réponses: 3
    Dernier message: 15/08/2003, 14h37
  5. [VB6] comment savoir si la commande shell est terminée ?
    Par ghyscharlotte dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 30/07/2003, 20h12

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