ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Win32APIコミュのTerminateProcess関数について

  • mixiチェック
  • このエントリーをはてなブックマークに追加
初めまして。よろしくお願いします。


現在、対戦型のコンソールのプログラムを2つ同時に走らせて、
終了したらまた新しい組み合わせで対戦させていくプログラムを作成しています。

CreateProcess()を使用して、2つのプロセスを動かしているのですが、
対戦が終了したときに、2つのプロセスが勝手には終了してくれないので
強制的に終了させる方法を探しています。


見つけた方法として、
?TerminateProcess()を使用する。
?CreateProcess()で起動されたプロセスの側で自主的に終了する(WinMain/main関数を抜ける)ように合図を送る

出来れば?が簡単なので、そちらを使いたいのですが、
MSDNによるとTerminateProcess()は推奨されない方法になっています。

質問は以下の二つです。
1、書き込み途中のファイルなどが,不完全なファイルとして残ってしまう以外で
何か問題点はあるのでしょうか?

2、ファイル操作の終了を確認できれば、TerminateProcess()を使用しても
よいのでしょうか?



(参考サイト)
ttp://itpro.nikkeibp.co.jp/article/COLUMN/20070126/259762/?ST=develop&P=2

コメント(3)

MSDN
http://msdn.microsoft.com/ja-jp/library/cc429376.aspx
によれば
1.→ あり
2.→ よいとはいえない
ですね。

> 現在、対戦型のコンソールのプログラムを2つ同時に走らせて、
> 終了したらまた新しい組み合わせで対戦させていくプログラムを作成しています。
・対戦型のコンソールプログラムは作成しているプログラムではない
・対戦させていくプログラムでコンソールプログラムを終了させたい
であれば
対戦型のコンソールプログラムの終了方法に合わせて作るか、これが不明ならばコンソールそのものを終了させて再度コンソールを起動させてはいかがでしょうか?
コンソールの終了例
hWnd = FindWindow("ConsoleWindowClass", NULL);
PostMessage(hWnd, WM_CLOSE, 0, 0);
OS が 9X 系の場合は
hWnd = FindWindow("tty", NULL);
だったかな?
コメントありがとうございます。

なるほど。

>これが不明ならば

今対戦させているコンソールプログラムはフリーソースなのでわかります。
ただ、後々ソースの入手不可能なプログラムでも使用する可能性もあるので、
対戦側のソースをまったく考慮せずに制御できるようにしたいです。

>コンソールそのものを終了させて再度コンソールを起動させてはいかがでしょうか?

コンソール自体を終了させる方法が今回は合ってそうですね^^
その方法を試して、あとで報告します。

ありがとうございました^^
結果の報告です。

>コンソールの終了例
hWnd = FindWindow("ConsoleWindowClass", NULL);
PostMessage(hWnd, WM_CLOSE, 0, 0);

現在制作中のプログラムに組み込んだのですが、こっちもコンソールだったので
すべて終了してしまうという結果になったので、ダイアログベースで作り直しました。

対戦プログラム自体はこのやり方でうまく終了できたのですが、
プログラムの記述が悪いのか、その後が動きませんあせあせ(飛び散る汗)


いろいろやってみたんですが、最終的に

CreateProcess()で生成したプロセスのhWndを取得するプログラムを
作って、直接PostMessage()でクローズしたらうまくいきました。


うまくいかなかった原因を調べる暇がなくて申し訳ないですが、
とりあえず作りたかったものが完成したのでこれで報告は終わりにします。

ありがとうございましたわーい(嬉しい顔)

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Win32API 更新情報

Win32APIのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング