- - PR -
exeの戻り値取得でエラー
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-04-02 13:05
使用言語:ASP.NET(VB.NET)
OS:Windows2000 ブラウザ:IE5.5以上 画面上のボタンクリックにより、exeを実行しています。 exeの中でRetrun値を正常のときに「0」、エラーのときに「1」を返すようにしています。 exeを実行してから終了するまで2分間ほどかかるのですが 呼出し側でexeの戻り値を取得するためにExitCode()とすると 「System.InvalidOperationException:+要求された情報を決定する前にプロセスを終了する必要があります。」 というエラーが発生してしまいます。 WaitForInputIdle()で無制限に待ってくれているはずですし exeのほうは正常終了しているようなのですが、 何か処理を間違えているのでしょうか? ソースは以下のようになっています。メッセージ出力など不必要な部分は削除しました。 --------------------------- Dim MutexName As String = "CheckList" Dim MutexOwner As Boolean Dim MutexObject As New System.Threading.Mutex(True, MutexName, MutexOwner) If MutexOwner = False Then 'すでに起動していると判断する MutexObject.Close() Exit Sub Else Try Dim myprocess As New System.Diagnostics.Process() '呼出しファイル myprocess.StartInfo.FileName = "********.exe" '引数設定 myprocess.StartInfo.Arguments = "01" 'プロセス開始 myprocess.Start() 'アイドル状態まで待機 myprocess.WaitForInputIdle() '戻り値によってメッセージ変更(正常終了0の場合はなし) If myprocess.ExitCode() <> "0" Then myprocess.Dispose() MutexObject.Close() Exit Sub End If 'プロセス終了 myprocess.Dispose() MutexObject.Close() Catch err As Exception Try MutexObject.Close() Catch err2 As Exception End Try End Try End If ---------------- どなたか分かる方がいましたらよろしくお願いします。 | ||||
|
投稿日時: 2004-04-02 13:11
Process.WaitForInputIdleでなく、
Process.WaitForExitでしょう。 ところで、ここで言う「アイドル状態」が何なのかは、理解できますよね? 車で言う「アイドリング」にあたる状態ですから。 [ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-04-02 13:17 ] | ||||
|
投稿日時: 2004-04-02 13:29
うむ、試してるうちに書かれてしまったか。
WaitForExit()にしたらきちんと終了まで待ってくれましたね。 あと関係ない話ですが、Option StrictはOnにした方が良いですよ。 VBならいざ知らず、.NETでは型というのは結構重要な概念ですから。 ----------------- ちなみに、VisualStudioを使っているのなら、プロジェクトのプロパティの共通プロパティ-ビルドの中で変更できます。 [ メッセージ編集済み 編集者: 一郎 編集日時 2004-04-02 13:33 ] | ||||
|
投稿日時: 2004-04-02 14:30
ぢゃん♪さん、一郎さん、返答ありがとうございます。WaitForExitに変更したら問題なく動きました。
テスト用に戻り値を返すだけにexeを使っていたときはWaitForInputIdleで問題なかったので その後に書き加えたMutexとかの使い方が間違っているのか根本的にプロセスの扱い方が間違っているのか分からなくなっていました。 Option Strictについていくつか記事を読んでみました。 使い方などまだ全然理解できていないのですが、「全ての変数の型を正しく宣言されたことを確認できる」といった感じでしょうか。 いま手を加えると収拾がつかなくなりそうなので落ち着いたら勉強してみたいと思います。 感謝感謝です。それではまた何かありましたらよろしくお願いします。 | ||||
|
投稿日時: 2004-04-02 14:40
解決されたようなのでもういいんですが、
Process.Disposeではプロセスは終了しません(プロセスを終了させるメソッドではありません)、念のため。 | ||||
|
投稿日時: 2004-04-02 15:20
なちゃさんありがとうございます。
実際のソースを記述すると myprocess.Dispose() 'myprocess.Close() といった風にどっちが正しいのか分からなくなってコメントになっていました。 「プロセス終了」というコメントが「プロセス解放」というコメントの間違いなのか、Close処理をすることが正しいことなのかが分かりません。 CloseとDisposeの違いについてはどこかで記事を見た記憶があるのですが、いまの私の頭では曖昧になっています。 VisualStudioでコード記述時に出てくるヘルプだとどちらも「解放」と書いてありますがDisposeだと全てを解放というものでしょうか。 確証をもってプログラムしないといけないのに私ときたら・・ | ||||
|
投稿日時: 2004-04-02 17:11
あ、ちょっと言葉足らずでしたが、CloseとDisposeの違いとかいう意味で書いたのではなく、いずれにしてもプロセスを終了するためのメソッドではないということです。 # あくまでプロセスに関する情報を管理するためのリソース?を解放するだけのはずです。 |
1