ウィンドウズフォームアプリケーションから対話型コンソールアプリケーションを操作する為の実装について
※環境 Win764Bit, .NetFramework4.0 or 4.5
本来DOSプロンプトで動作する対話型プログラム、例えばMySQL.exeなどをにコマンドを送り、その表示結果を取得するウィンドウズフォームアプリケーションを作成しています。
動作イメージは添付の画像のような感じで、テキストボックスにコマンドを入力し、送信ボタンを押すことを繰り返す事で作業を進めます。
これを実現するために以前質問した内容(ウィンドウズフォームアプリケーションから対話型コンソールアプリケーションを操作するには?)を踏まえて作成してみたのですが上手く行きません。
主な処理概要として、
1.フォームをロードするタイミング(Loadイベント)でSystem.Diagnostics.Process
で対象となるコンソールアプリケーション(mysql.exe)のプロセスを立ち上げ、プロセス自体はフォームの変数へ保持しておく。
2.送信ボタンを押すとフォームに保持してあるプロセスに対してStandardInput.WriteLine
とStandardOutput.ReadLine
で入出力を行いその結果を結果領域に表示します。
この時StandardInput.WriteLine
でコマンドを送出した瞬間にプロセスが終了していまい、結果を受け取ることは可能なのですがその後の操作が継続して行う事が出来ません。
プロセスが終了しなければ良いと思いWaitForExit
を試してみましたが同期待機なので画面がフリーズして使えませんでした。
非同期で待機が可能なProcess.Exited
も試しましたがStandardInput.WriteLine
処理でプロセスが終了してしまう事には変わりがありませんでした。
なんとかプロセスが終了せず継続してコンソールアプリケーションと対話を続ける方法はないものでしょうか?
なるべく.NETでの実現を望んでいますがインターフェイスだけ.NETであればいいので他の言語などでの実現方式もあればヒントを頂ければ嬉しいです。
前回@pgrho様に丁寧に教えて頂いたのですが当方の理解が足りず再度の質問となります。
皆様のお力添えを頂ければと思います。
なにとぞよろしくお願いします。
以下検証中のプログラムコードです。
Imports System.Diagnostics
Public Class Form1
Private p As New Process
Private Sub p_Exited(ByVal sender As Object, ByVal e As EventArgs)
'プロセスが終了したときに実行される
MessageBox.Show("終了しました。")
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'起動するファイルを指定する
Dim command As String = "C:\xampp\mysql\bin\mysql.exe"
p.StartInfo.FileName = command
p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardInput = True
p.StartInfo.RedirectStandardOutput = True
p.StartInfo.RedirectStandardError = True
p.SynchronizingObject = Me
AddHandler p.Exited, New EventHandler(AddressOf p_Exited)
p.EnableRaisingEvents = True
p.Start()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
p.StandardInput.WriteLine("show databases;" + "\r\n")
Dim output As String = p.StandardOutput.Read()
Dim errorStrings As String = p.StandardError.Read()
MsgBox(output + errorStrings)
End Sub
End Class