Interface entre un éxécutable et un code VB 2008 [Résolu]

Signaler
Messages postés
74
Date d'inscription
lundi 20 février 2006
Statut
Membre
Dernière intervention
2 août 2010
-
Messages postés
74
Date d'inscription
lundi 20 février 2006
Statut
Membre
Dernière intervention
2 août 2010
-
Bonjour à tous,

je viens à vous car j'ai un petit problème qui m'empêche d'avancer dans mon programme depuis un moment...

Donc je vous l'expose même si je pense que ce problème a déjà été posé bien que je n'ai rien trouvé sur le net.

J'ai un exécutable en invite de commande qui me pose une série de questions au quelles je dois répondre du genre "il fait beau?" donc je réponds puis "il fait chaud?" et je réponds et ainsi de suite...

Maintenant j'aimerais grâce à VB 2008 répondre à ces questions en fonction de variable que l'utilisateur va rentrés. En somme il me faut un moyen pour communiquer avec l'invite de commande.

Par ailleurs, cet exécutable me sors une série de résultat que j'aimerais bien pour voir mettre dans une variable du code VB.


J'ai essayé avec process.start et autre standardInpout mais sans succès. Voilà le bout de code que j'ai déjà fait.

 Private Sub test_()
        Dim inputText As String
        Dim numLines As Integer = 0
        Dim psi As New ProcessStartInfo()
        'psi.Arguments = "/C DIR *.*"
        psi.FileName = "temps.EXE"
        psi.RedirectStandardInput = True
        ' psi.StandardOutputEncoding = _
        'Encoding.GetEncoding("ibm850")
        psi.UseShellExecute = False
        Dim p As Process = Process.Start(psi)
        Dim myStreamWriter As StreamWriter = p.StandardInput
        'Do
        inputText = "oui"
        ' If inputText.Length > 0 Then
        '            numLines += 1
        myStreamWriter.WriteLine(inputText)
        'End If
        'Loop While inputText.Length <> 0 ''
        'p.WaitForExit()
        ' p.Close() ''


        psi.RedirectStandardOutput = True
        Using o As StreamReader = p.StandardOutput
            While Not o.EndOfStream
                Me.Label5.Text &= o.ReadLine & vbCrLf
            End While
        End Using
    End Sub

9 réponses


Bonsoir,
Ton code ne peut pas fonctionner puisque tu n'a pas mis de Handler te permettant de détecter un eventuel message de sortie de ton exe.
Il faut utiliser AddHandler.
De plus tu n'a pas ordonné a ton application de commencer à lire les sorties de ton exe
avec la fonction BeginOutputReadLine()

Voici un exemple qui fonctionne :

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        monProcess = New Process()
        monProcess.StartInfo.FileName = Application.StartupPath & "\temps.exe"
        monProcess.StartInfo.CreateNoWindow = True
        monProcess.StartInfo.UseShellExecute = False
        monProcess.StartInfo.RedirectStandardOutput = True
        AddHandler monProcess.OutputDataReceived, AddressOf DonneesRecues
        monProcess.StartInfo.RedirectStandardInput = True
        monProcess.Start()
        sortStreamWriter = monProcess.StandardInput
        monProcess.BeginOutputReadLine()
        sortStreamWriter.WriteLine("oui")
        sortStreamWriter.Flush()
    End Sub

    Private Sub DonneesRecues(ByVal monProcess As Object, ByVal Ligne As DataReceivedEventArgs)
        If Not String.IsNullOrEmpty(Ligne.Data) Then
            Dim txt As String = Ligne.Data.ToString
            Debug.Print(txt)
        End If
    End Sub


Bonne soirée
Messages postés
74
Date d'inscription
lundi 20 février 2006
Statut
Membre
Dernière intervention
2 août 2010

pas de réponse...

je réponds tout seul du coup, enfin en partie.
Donc après une journée de recherche j'ai réussi à mettre en place un système D.

   
Public Sub Wait(ByVal time As Integer)
        Dim temps_reference As Date = now
        While temps_reference.AddSeconds(time) > Now
            Threading.Thread.Sleep(10)
            Application.doevents()
        End While
    End Sub

    Public Sub test()
Shell("meteo", 1)
        SendKeys.Send("oui")
        SendKeys.Send("{ENTER}")
        Wait(1) 'attends 1 seconde
        SendKeys.Send("non")
        SendKeys.Send("{ENTER}")

Le problème majeur est donc qu'il va y avoir beaucoup de temps perdu mais je n'ai pas réussi à faire autrement?

Je suis donc encore à la recherche de solution miracle!
Messages postés
74
Date d'inscription
lundi 20 février 2006
Statut
Membre
Dernière intervention
2 août 2010

Merci beaucoup pour cette réponse ça marche parfaitement.

Juste une dernière question, lorsque je réponds aux questions de mon programme il m'ouvre une fenêtre, nommée "exemple". Cette fenêtre est un déchet et j'aimerais savoir comme la fermer sans pour autant terminer le processus.

J'ai bien regardé avec TerminateProcess je n'arrive pas vraiment à le faire fonctionner

J'espère avoir été clair!

Bonsoir,
En principe si tu lance ton exe avec :
monProcess.StartInfo.CreateNoWindow = True

Tu ne devrais pas avoir de problèmes.
Bonne soirée.
Messages postés
74
Date d'inscription
lundi 20 février 2006
Statut
Membre
Dernière intervention
2 août 2010

le problème est qu'effectivement j'ai mis cette ligne de code mais la fenêtre s'ouvre quand même. Ce n'est pas la fenêtre principale de l'exe mais une sous-jacente à l'exécution et je n'ai que son nom. Je sais pas si tu as une idée pour fermer une fenêtre dont on a juste le nom...

En tout cas merci de ton intérêt.

Bonsoir,
Le mieux serait d'ouvrir un nouveau sujet sur le forum. Je ne suis pas compétant dans ce domaine.
Bonne soirée.
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
34
Juste une dernière question, lorsque je réponds aux questions de mon programme il m'ouvre une fenêtre, nommée "exemple". Cette fenêtre est un déchet et j'aimerais savoir comme la fermer


Ce n'est pas la fenêtre principale de l'exe mais une sous-jacente à l'exécution et je n'ai que son nom. Je sais pas si tu as une idée pour fermer une fenêtre dont on a juste le nom...


C'es toi qui a créé cet exécutable ? tu en possède donc la source et tu dois être en mesure de la modifier ?

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
74
Date d'inscription
lundi 20 février 2006
Statut
Membre
Dernière intervention
2 août 2010

"mon programme" veut en faite dire que je le possède, pas que j'ai les sources. Sinon ça aurait été plus facile je te l'accorde.

Pour le nouveau sujet, je vais le faire!

Encore merci banana32 pour l'aide que tu m'as apporté
Messages postés
74
Date d'inscription
lundi 20 février 2006
Statut
Membre
Dernière intervention
2 août 2010

En fait, je viens de résoudre plus ou moins mon problème. J'ai tout simplement killer le processus
monprocess.kill()
cela ferme tout le programme mais pour mon application cela n'est pas si dérangeant!

merci à tous