tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル外部アプリケーションによる終了方法
記事No9269
投稿日: 2009/08/21(Fri) 12:42
投稿者ネヴュラ
起動中のアプリケーション(仮にprogramA.exeとします)を
外部のアプリケーション(仮にprogramB.exeとします)で終了するように
下記のようにプログラムを作成しました。


------ programB.exeの内容 ------

'コンピュータ上で実行されている"programA"という名前のすべてのプロセスを取得
Dim prcs As Process() = Process.GetProcessesByName("programA")

'配列から1つずつ取り出す
For Each prc As Process In prcs

 If Not prc.CloseMainWindow() Then
  ' 終了できなかった場合は強制終了

  prc.Kill()
 End If

Next

-------------------------


しかし、上記の方法ではprcTemp.CloseMainWindowの結果は必ずfalseとなってしまうみたいで
毎回必ずif文の中を通ってprc.Kill()が実行されます。

prc.Kill()でもprogramAは終了されるのですが、prc.Kill()でプログラムを終了した場合、
タスクトレイにprogramAのアイコンが残ってしまいます。

そのため、Killのような強制終了ではなく、
外部アプリケーションからでも正しく終了できるような方法を探しているのですが
何か良い方法はございませんでしょうか?

[ツリー表示へ]
タイトルRe: 外部アプリケーションによる終了方法
記事No9270
投稿日: 2009/08/21(Fri) 13:20
投稿者YuO
> 外部アプリケーションからでも正しく終了できるような方法を探しているのですが
> 何か良い方法はございませんでしょうか?

ありません。

アプリケーションによっては提供されていますが,方法はばらばらです。
# Office製品のオートメーションなど。

WM_CLOSEを投げれば「うまくいくかもしれない」程度に考えるのがよいです。
# これがProcess.CloseMainWindowであるわけですが。

[ツリー表示へ]
タイトルRe^2: 外部アプリケーションによる終了方法
記事No9272
投稿日: 2009/08/24(Mon) 09:12
投稿者ネヴュラ
ご回答ありがとうございます。
返事が遅くなりまして申し訳ありません。

> > 外部アプリケーションからでも正しく終了できるような方法を探しているのですが
> > 何か良い方法はございませんでしょうか?
>
> ありません。
>

そうですか‥、残念です‥。

> アプリケーションによっては提供されていますが,方法はばらばらです。
> # Office製品のオートメーションなど。
>

終了させたいアプリケーション側(例の場合はprogramA)に
外部から終了できるような口を開けてやれば良いということでしょうか?
具体的にどのようにすれば良いのか思い付かないのですが
ご存知であればご教示のほどよろしくお願いします。

[ツリー表示へ]
タイトルRe^3: 外部アプリケーションによる終了方法
記事No9283
投稿日: 2009/08/25(Tue) 18:59
投稿者YuO
> 終了させたいアプリケーション側(例の場合はprogramA)に
> 外部から終了できるような口を開けてやれば良いということでしょうか?
> 具体的にどのようにすれば良いのか思い付かないのですが
> ご存知であればご教示のほどよろしくお願いします。

方法論は幾つもあると思いますが……。
・programAが名前付き同期イベントを用意していて,それがセットされたタイミングで終了する
・programAがTCP/IPなりUDP/IPなりでメッセージを受け付けるようにしておく
・programAが.NET Remoting用の口を用意しておいて,メソッド呼び出しを受け付ける
etc.

最初の,同期イベント (System.Threading.AutoRseetEvent/ManualResetEvent) が一番簡単だと思います。
終了時に色々情報を送りたいなら.NET RemotingとかWCFとかに頼る事になると思いますが。

[ツリー表示へ]