Interface entre un éxécutable et un code VB 2008

Résolu
Ankaa1988 Messages postés 74 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 2 août 2010 - 17 juin 2010 à 12:10
Ankaa1988 Messages postés 74 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 2 août 2010 - 22 juin 2010 à 08:26
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

Utilisateur anonyme
18 juin 2010 à 19:55
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
3
Ankaa1988 Messages postés 74 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 2 août 2010
18 juin 2010 à 09:37
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!
0
Ankaa1988 Messages postés 74 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 2 août 2010
20 juin 2010 à 12:38
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!
0
Utilisateur anonyme
21 juin 2010 à 18:31
Bonsoir,
En principe si tu lance ton exe avec :
monProcess.StartInfo.CreateNoWindow = True

Tu ne devrais pas avoir de problèmes.
Bonne soirée.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ankaa1988 Messages postés 74 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 2 août 2010
21 juin 2010 à 20:52
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.
0
Utilisateur anonyme
21 juin 2010 à 21:08
Bonsoir,
Le mieux serait d'ouvrir un nouveau sujet sur le forum. Je ne suis pas compétant dans ce domaine.
Bonne soirée.
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
22 juin 2010 à 03:44
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.
0
Ankaa1988 Messages postés 74 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 2 août 2010
22 juin 2010 à 08:20
"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é
0
Ankaa1988 Messages postés 74 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 2 août 2010
22 juin 2010 à 08:26
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
0
Rejoignez-nous