- PR -

exeの戻り値取得でエラー

1
投稿者投稿内容
きち
常連さん
会議室デビュー日: 2003/12/17
投稿数: 41
投稿日時: 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
----------------
どなたか分かる方がいましたらよろしくお願いします。
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-04-02 13:11
Process.WaitForInputIdleでなく、
Process.WaitForExitでしょう。

ところで、ここで言う「アイドル状態」が何なのかは、理解できますよね?
車で言う「アイドリング」にあたる状態ですから。

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-04-02 13:17 ]
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-04-02 13:29
うむ、試してるうちに書かれてしまったか。
引用:

ぢゃん♪さんの書き込み (2004-04-02 13:11) より:
Process.WaitForInputIdleでなく、
Process.WaitForExitでしょう。


WaitForExit()にしたらきちんと終了まで待ってくれましたね。


あと関係ない話ですが、Option StrictはOnにした方が良いですよ。
VBならいざ知らず、.NETでは型というのは結構重要な概念ですから。

-----------------
ちなみに、VisualStudioを使っているのなら、プロジェクトのプロパティの共通プロパティ-ビルドの中で変更できます。

[ メッセージ編集済み 編集者: 一郎 編集日時 2004-04-02 13:33 ]
きち
常連さん
会議室デビュー日: 2003/12/17
投稿数: 41
投稿日時: 2004-04-02 14:30
ぢゃん♪さん、一郎さん、返答ありがとうございます。WaitForExitに変更したら問題なく動きました。
テスト用に戻り値を返すだけにexeを使っていたときはWaitForInputIdleで問題なかったので
その後に書き加えたMutexとかの使い方が間違っているのか根本的にプロセスの扱い方が間違っているのか分からなくなっていました。

Option Strictについていくつか記事を読んでみました。
使い方などまだ全然理解できていないのですが、「全ての変数の型を正しく宣言されたことを確認できる」といった感じでしょうか。
いま手を加えると収拾がつかなくなりそうなので落ち着いたら勉強してみたいと思います。

感謝感謝です。それではまた何かありましたらよろしくお願いします。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-04-02 14:40
解決されたようなのでもういいんですが、

引用:

きちさんの書き込み (2004-04-02 13:05) より:
    'プロセス終了
    myprocess.Dispose()


Process.Disposeではプロセスは終了しません(プロセスを終了させるメソッドではありません)、念のため。
きち
常連さん
会議室デビュー日: 2003/12/17
投稿数: 41
投稿日時: 2004-04-02 15:20
なちゃさんありがとうございます。

実際のソースを記述すると
myprocess.Dispose()
'myprocess.Close()
といった風にどっちが正しいのか分からなくなってコメントになっていました。
「プロセス終了」というコメントが「プロセス解放」というコメントの間違いなのか、Close処理をすることが正しいことなのかが分かりません。

CloseとDisposeの違いについてはどこかで記事を見た記憶があるのですが、いまの私の頭では曖昧になっています。
VisualStudioでコード記述時に出てくるヘルプだとどちらも「解放」と書いてありますがDisposeだと全てを解放というものでしょうか。

確証をもってプログラムしないといけないのに私ときたら・・
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-04-02 17:11
引用:

きちさんの書き込み (2004-04-02 15:20) より:

実際のソースを記述すると
myprocess.Dispose()
'myprocess.Close()
といった風にどっちが正しいのか分からなくなってコメントになっていました。
「プロセス終了」というコメントが「プロセス解放」というコメントの間違いなのか、Close処理をすることが正しいことなのかが分かりません。

CloseとDisposeの違いについてはどこかで記事を見た記憶があるのですが、いまの私の頭では曖昧になっています。
VisualStudioでコード記述時に出てくるヘルプだとどちらも「解放」と書いてありますがDisposeだと全てを解放というものでしょうか。


あ、ちょっと言葉足らずでしたが、CloseとDisposeの違いとかいう意味で書いたのではなく、いずれにしてもプロセスを終了するためのメソッドではないということです。
# あくまでプロセスに関する情報を管理するためのリソース?を解放するだけのはずです。
1

スキルアップ/キャリアアップ(JOB@IT)