Windowsのプロセス関連のAPIを勉強中です。

タスクマネージャでアプリケーションを強制終了させようとすると、正常終了できるときはしようとしますよねぇ。
これはAPIのTerminateProcessでは決してできなそうなのですが、アプリケーションに正常終了を促すのはどうやればよろしいんでしょうか。

自分であれこれ考えた結果、CreateRemoteProcessでExitProcessを実行するスレッドを、対象のプロセスに植え付けるぐらいしか思いつかなかったのですが、これは正しいんでしょうか(試してません)。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

こんにちは。

itohhといいます。

>プロセスIDからウィンドウのハンドルを得る方法がわからないのですが、
>どうしたらよいでしょう。
自分でCreateProcessしたときに取得したプロセスIDでしょうか?
それですと簡単です。

ちょっと時間がないので、参考になるサイトを載せておきますのでそちらをご覧になってください。

・Visual C TechTips
URL:http://techtips.belution.com/ja/vc/

・新しいプロセスを作成し、そのプロセスが作成したウィンドウハンドルを取得するには?
URL:http://techtips.belution.com/ja/vc/0024/
    • good
    • 0
この回答へのお礼

EnumThreadWindowsですね。
Get~とかQuerry~とかばっか調べてて、Enumまでは気が付きませんでした。
プロセスが持ってるスレッドのIDはわかるので、これはかなり利用できそうです。
ありがとうございました。

お礼日時:2002/02/13 00:06

こんにちは。

itohhといいます。

VBアプリケーションでもWM_CLOSEメッセージはOKだと思いますよ。
もしかしたら、WM_DESTROYメッセージかもしれませんが。

ウィンドウを持たないアプリケーションについては、難しいですね。
アプリケーションがどういった状態で待ちに入っているか判らないわけですよね?
(メッセージ待ちなのか、ロックオブジェクトで待っているのか、sleepで待っているのか...)
ご自身で作成するアプリケーションならば、
ロックオブジェクトで待っていてSetEventなどで終了を通知されるまで待つ
という方法もあるとは思います。
    • good
    • 0
この回答へのお礼

そっか、VBがWM_CLOSEを受け取れなかったら、ログオフ時に正常終了できるはずがありませんよね。
そうすると、プロセスIDからウィンドウのハンドルを得る方法がわからないのですが、どうしたらよいでしょう。
VCのウィンドウプログラミングはしたことがないので。

お礼日時:2002/02/12 16:04

こんにちは。

itohhといいます。

>タスクマネージャでアプリケーションを強制終了させようとすると、
>正常終了できるときはしようとしますよねぇ。
これは、メッセージを受け付けることが出来る状態だからですよね。

WM_CLOSEメッセージを投げるというのはどうでしょうか?

WindowsプログラムならWM_CLOSEメッセージを受け取る処理は組み込まれていて
当たり前と思うのですが。
    • good
    • 0
この回答へのお礼

それだと、ウィンドウを持っていないアプリケーションやVBアプリケーションに対応できないと思ったので、甘いと思ったのです。
もちろんExitProcessはVBでは正常終了しませんが。

コンソールアプリケーションはやはり正常終了されるのはムリでしょうか?

お礼日時:2002/02/11 13:38

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QMacの強制終了

Mac OS9ですが何度再起動しても、フリーズしたままの状態になってしまいました。強制終了しようとしてもできません。どーすればいいでしょうか???

Aベストアンサー

PRAMのクリアを試みてください。
再起動するときにoption、コマンド、P、Rキーの4つのキーを同時に押します。
起動音が5回ほど聞こえたらキーを離します。
これでフリーズなしで起動きませんか?

Qアクセス違反でアプリケーションポップアップが出たのにプロセスが終了しない

OS:Windows2000、VC++6.0 の環境です。
自作のアプリケーションにてアクセス違反が発生し、
以下のアプリケーションポップアップが出ました。

アプリケーションポップアップ: AAA.exe - アプリケーション エラー :
"0x0c88026d" の命令が "0x09680048" のメモリを参照しました。
メモリが "written" になることはできませんでした。
プログラムを終了するには [OK] をクリックしてください
プログラムをデバッグするには [キャンセル] をクリックしてください

で、「OK」ボタンを押したのですが、プロセスは終了せず、
処理が続行されてしまいました。
なぜプロセスが終了しないのかがわかりません。
何かの設定でしょうか???

識者の方、ご教授願います。

Aベストアンサー

こんにちは。itohhといいます。

AAA.EXEがどのような処理を行うプログラムなのかわかりませんが。
例えば、
マルチスレッドなどの場合、起こりえるのではないでしょうか?

ただ、わたしもそのような現象は体験したことがありません。

余計なお世話かもしれませんが。(^^;
作成した本人しか使用しないプログラムなら良いですが、そうでない場合は、
例外処理を行ってそのようなダイアログボックスを出さないようにした方が良いですよ。

Q至急 macを強制終了させたら謎の図が表示されます

マウスとキーボードが反応しなかったので、強制終了させたら謎の2つの図が表示されるようになりました。

何度か終了起動させても同じ図が出ます。
何かに緑色と矢印、何を示しているのだかわからないです。

型はmacbook pro 2015です。
お分かりの方ご回答お願いします。

Aベストアンサー

マウスの裏にあるスイッチがONになってないんじゃないですか?

QコンソールアプリケーションでのWIN32 APIメッセージ処理

コンソールアプリケーションでのWIN32 APIメッセージ処理

VisualStdio.NET 2005のC++で作成しているコンソールアプリケーションで、
PostMessageでメッセージを送信しているのに、PeekMessageで検出できません。
下のプログラムに誤った点があるのでしょうか?

尚、ウィンドウハンドルの確認部分はパスしますが、
PostMessageとPeekMessageの引数hWndをNULLに置き換えるとメッセージの検出はできるので、
やはり、ウィンドウハンドルに問題があるのかもしれません。


#include <windows.h>
#include <stdio.h>

void main( void )
{
  char OldTitle[1024], NewTitle[1024];
  char WindowText[1024], ConsoleTitle[1024];
  HWND hWnd;
  MSG Msg;

  /*** ウィンドウハンドルの取得 ***/

  GetConsoleTitle( OldTitle, 1024 );
  wsprintf( NewTitle, "%d/%d", GetTickCount(), GetCurrentProcessId());
  SetConsoleTitle( NewTitle );
  Sleep(40);
  hWnd = FindWindow( NULL, NewTitle );
  SetConsoleTitle( OldTitle );

  /*** ウィンドウハンドルの確認 ***/

  GetWindowText( hWnd, WindowText, 1024 );
  GetConsoleTitle( ConsoleTitle, 1024 );

  if ( strcmp( WindowText, ConsoleTitle ) != 0 ){
    printf( "ウィンドウハンドルが不正です" );
    return;
  }

  /*** メッセージの送信と検出 ***/

  PostMessage( hWnd, 1050, 0, 0 );
  do{
    while ( PeekMessage( &Msg, hWnd, 0, 0, PM_REMOVE )){
      printf( "メッセージを検出しました" );
      return;
    }
  } while( 1 );
}

コンソールアプリケーションでのWIN32 APIメッセージ処理

VisualStdio.NET 2005のC++で作成しているコンソールアプリケーションで、
PostMessageでメッセージを送信しているのに、PeekMessageで検出できません。
下のプログラムに誤った点があるのでしょうか?

尚、ウィンドウハンドルの確認部分はパスしますが、
PostMessageとPeekMessageの引数hWndをNULLに置き換えるとメッセージの検出はできるので、
やはり、ウィンドウハンドルに問題があるのかもしれません。


#include <windows.h>
#include <stdio.h>
...続きを読む

Aベストアンサー

ANo2のソースは勘違いでした。
FindWindowで0が返っています。
うまく行っていたように見えただけでした。

http://support.microsoft.com/kb/124103/jaの中に

[FindWindowで]取得した HWND の値は、すべてのウィンドウハンドルを使用する処理において、適切なものであるとは保証されていません。

と書いてあります。

これが正しいのではないかと思います。

Qintel macでのイラストレーター強制終了

intel mac(バージョン10.4.10)で、イラストレーターとフォトショップ(SC2)を同時に使うと必ず片方が強制終了になってしまいます。
CS2とintel macの相性が悪いのか、メモリ不足なのかわからず、ヨドバシカメラの店員さんに聞いても、そんな話は聞いたことがないと言われてしまいました。
メモリは増やしていなくて512のままです。
アクティビティモニタを見ると、イラストレーターを立ち上げた状態で空きは5MBほどです。(これがどういう状況なのか私はよくわからないのですが。。)
CS3を買うべきなのか、メモリを増やせばすむ話なのか、どなたか教えて下さい。
なるべくメモリで済むといいんですが。。

Aベストアンサー

確かに、512MBのメモリでは、「ぎりぎり」って感じがします。それが直接原因かわかりませんが、一因であるとは言えるでしょう。
OSXでアプリケーションのメモリ割当が自動になったせいで、OS9の時のように無理矢理少なく押さえておくということができなくなったため、一時的に大きな負荷がかかると落ちてしまうんだと思います。

単純にCS3を買うべきか、メモリを増やすべきか?という質問のシンプルな回答は、メモリを増やすべきです。というのもCSよりCS2の方が、アプリケーションを動作させるのに使うメモリが増えています。機能が増えているので当然だと思いますが、そうなるとCS3はより多くのメモリを使うと想定されるからです。(未確認ですが)

作業中に強制終了するのは、精神的にも時間的にもよろしくないと思いますので、まずはメモリを購入することをおすすめします。
スペックに問題がないMacでも、いろんな問題はちょこちょこ起きて強制終了したりするので、最低限、不安要素は減らしてみるのが得策かと思います。

QWin32APIで入力した数値を反映させたアプリケーションを動かすにはどうすればよいでしょうか?

C++をはじめたばかりなのですが、waveout関数に興味を持ち、今現在勉強中です。

http://www13.plala.or.jp/kymats/study/MULTIMEDIA/waveOut_stereo_16.cppに載っているサンプルをhttp://oshiete1.goo.ne.jp/qa5223409.htmlで頂いたアドバイスを参考にして、「CPad for Borland C++ Compiler」でも警告なしでコンパイルできるようにしました。

サンプルでは、
>#define F400//周波数(1秒間の波形数)
で周波数が設定されてあります。

これを、ユーザがキーボードで数値を入力して自由に周波数を設定できるように変更しようと思いました。
コマンドプロンプトで数値を入力するのではなく、新しくウィンドウを開いて、数値を入力するためのボックスを開きたいと思います。

ですが、これをC++とWin32APIで実行するための専用の関数が見当たりません。

たとえば、『C/C++によるWin32API -APIサンプル集(http://homepage1.nifty.com/MADIA/vc/api/)』にあるサンプルプログラムを拝見させていただいたのですが、発見することができませんでした。予め設定された選択肢から選択するメニューについては紹介されていたのですが、入力フォームを作る方法については紹介されていなかったように思えます。

Win32APIで数値を入力して
>#define F400
の「400」の部分を変えるためには、どのようにすればよいでしょうか?

C++をはじめたばかりなのですが、waveout関数に興味を持ち、今現在勉強中です。

http://www13.plala.or.jp/kymats/study/MULTIMEDIA/waveOut_stereo_16.cppに載っているサンプルをhttp://oshiete1.goo.ne.jp/qa5223409.htmlで頂いたアドバイスを参考にして、「CPad for Borland C++ Compiler」でも警告なしでコンパイルできるようにしました。

サンプルでは、
>#define F400//周波数(1秒間の波形数)
で周波数が設定されてあります。

これを、ユーザがキーボードで数値を入力して自由に周波数を設定でき...続きを読む

Aベストアンサー

『猫でもわかるプログラミング』というサイト(参考URL)の
Windows SDK編 第34章 エジットコントロールの張り付け
という記事が参考になるかもしれません。

参考URL:http://www.kumei.ne.jp/c_lang/

Q【Mac】Eudoraでの強制終了

私は、Windows98のOE6.0を使っているのですが、
昨日、メールを送った相手からのお返事に、
私が送ったメールを直接返信すると
メーラーが強制終了してしまう。
ウィルスに感染しているのではないか、
というご連絡をいただきました。

一応、最新のウィルスバスター(勿論データ更新もしております)も
リアルタイム監視してますし、
ウィルスと思われるメールも受け取ってませんし、
他の方からそのようなご連絡もいただいておりません。
もちろんメールはいつもテキスト形式で、HTMLメールは絶対使いません。
念のため、ウィルスバスターでPC内をチェックしましたが、
何も発見されませんでした。

相手の方は、MacでEudoraをお使いになられているようですが、
一昨日、私が他のMacユーザの方(使用メーラーは不明)と
メールのやりとりをした時は、別に問題はありませんでした。
(数十分の内に4通ほどやりとりをしているので、
 感染したり、何かトラブルがあったりしたら
 メール内で、そのことを教えてくれると思いますので…)

EudoraとOEは相性が悪いとか、何か原因があるのでしょうか。
御存知の方いらっしゃいましたら、よろしくお願いいたします。

私は、Windows98のOE6.0を使っているのですが、
昨日、メールを送った相手からのお返事に、
私が送ったメールを直接返信すると
メーラーが強制終了してしまう。
ウィルスに感染しているのではないか、
というご連絡をいただきました。

一応、最新のウィルスバスター(勿論データ更新もしております)も
リアルタイム監視してますし、
ウィルスと思われるメールも受け取ってませんし、
他の方からそのようなご連絡もいただいておりません。
もちろんメールはいつもテキスト形式で、HTMLメールは絶対使...続きを読む

Aベストアンサー

日常Eudoraを使用していますが、Verssion4.3以降ではご指摘の状況に陥ったことはありません(たまたまかも知れませんが)。

それ以前のバージョンではある特定のメールを開こうとすると落ちると言う現象はそれまではチョクチョクありました。
その度に原因を探ってみたところ、メールの中に特殊なコードが紛れ込んでいる事が分かりました。
一つは半角カタカナ、もう一つは1バイトコードの制御コードでした。
他の方法(エディター等)でそのコードを削除すると開く様になりました。(ちょっと専門的になって申し訳ありません。)
たぶん、文字入力の際に何らかの原因(Ctrl-Vを押したか何か)でその様な文字が入力されたものと想像しました。

あと、メールを送る際にHTMLではなく、テキストで送る事を心がければ同様なトラブルは防げるかも知れません。(意識して、あるいは無意識のうちに入力した制御文字でのトラブルは防げませんが。)

ウイルスではないと思います。

Qウインドウのプロセス終了について

今C++でタスクバーのウインドの列挙を行い、またプロセスIDの取得を
できたのですがこれらを終了させる方法がわかりません。
いろいろ調べてみたのですが、UNIXでのkillコマンドに匹敵する
関数がわかりません。
自分が調べたところ使えそうなのは。
CloseMainWindow関数
TerminateProcess関数
などができそうなのではと考えています。
また
http://akky.cjb.net/mfc/appclose.html
ここに書いてあるソースを打ってみたのですが、
思うように動きませんでした。
どうしたらよいでしょうか。
具体的な方法(プログラム)がほしいです。
よろしくお願いします。

Aベストアンサー

★アドバイス
・ウインドウの列挙は出来ているのならばそのウインドウ・ハンドルを使って
 WM_CLOSE メッセージを送れば良いでしょう。
 以前、GetWindowThreadProcessId 関数の使い方を質問した方ですね。
・プロセスを終了するだけなら次の1行で出来ると思います。
 SendMessage( 列挙したウインドウのハンドル, WM_CLOSE, 0, 0 );
 これ1行です。
・なお、TerminateProcess 関数は強制的にプロセスを終了させるかなり強引な
 方法です。この方法はあまりお勧めできません。
 理由はメモ帳などでまだ保存されていないデータは失われます。
 WM_CLOSE メッセージなら確認のダイアログなどが出ると思います。
 強制的にプロセスを終了させる場合以外は TerminateProcess 関数は使わないこと。
・参考にしているサイトは自ら起動したプロセスを GetWindowThreadProcessId 関数を
 使ってプロセスIDをチェックしています。また、このサイトでも終了させる方法に
 PostMessage( hWnd, WM_CLOSE, 0, 0 );
 としています。既に答えが書かれていますよ。(笑)

サンプル:
int main( void )
{
 HWND hWnd;
 
 // 列挙したウインドウハンドルの代わり
 hWnd = FindWindow( "Notepad", NULL );
 
 if ( hWnd != NULL ){
  printf( "メモ帳を終了します。-- pause --\n" );
  getchar();
  PostMessage( hWnd, WM_CLOSE, 0, 0 );
 }
 else{
  printf( "メモ帳を起動してから実行して下さい。\n" );
 }
 return 0;
}

メモ帳に何か文字を入力してから実行してみると終了しようとしたときにメモ帳から
保存の確認ダイアログが出ます。これを出さずに強制終了させたい場合には
TerminateProcess 関数などを使います。
以上。

★アドバイス
・ウインドウの列挙は出来ているのならばそのウインドウ・ハンドルを使って
 WM_CLOSE メッセージを送れば良いでしょう。
 以前、GetWindowThreadProcessId 関数の使い方を質問した方ですね。
・プロセスを終了するだけなら次の1行で出来ると思います。
 SendMessage( 列挙したウインドウのハンドル, WM_CLOSE, 0, 0 );
 これ1行です。
・なお、TerminateProcess 関数は強制的にプロセスを終了させるかなり強引な
 方法です。この方法はあまりお勧めできません。
 理由はメモ帳など...続きを読む

Qsafariやforefoxの強制終了について。

safari2.0.3やforefoxなどのブラウザでjavaを表示すると強制終了してしまいます。
http://kandakandaxa.web.fc2.com/clock24.html
などを表示させてその後別のページへ移動(戻るや進む、ホームへ移動)すると強制終了してしまいます。
この症状がでるのは僕だけでしょうか?
また、なぜでしょうか?
mac版IEで表示しても強制終了は起こりません。

Aベストアンサー

http://question.excite.co.jp/kotaeru.php3?q=1906698

この当時のまま、ということなんですよね?
改めてトピックを立てるのであれば、
せめて前回試された事くらいは併記するべきでは?
過去記事の存在を知らない方は同じ事を教えて下さるかもしれませんので、
その情報はあなたにとっては必要の無いものでしょうし、
時間を割いてご教示して下さった方にも申し訳が立たないでしょうからね。

さて。

【実行済み…と思われるもの】以前に提示した方法

・Safari のキャッシュクリア
・com.apple.Safari.plist の退避&削除
・ユーティリティ>Java 1.4.2 プラグイン設定 からキャッシュクリア
・ユーティリティ>Java>J2SE 5.0>Java Preferences から
 実行時の設定で J2SE 5.0 を上位に変更

その後更に試されたものがあれば、可能な範囲で補足下さると宜しいかと…。

以下、ご呈示情報にはないが独断で思い当たるその他事例&対処

・アクセス権の検証および修復
・キーチェインアクセスでのキーチェインの検証および修復
・Mac OS X v10.4.4 combined update を適用して確認
・SafariStand などを使っている場合は使用を停止して確認
・Mac OS X 上で別のアカウントを作成して挙動を確認
・~/Library/InputManagers 内にあるものを退避して確認
・ATOK を使っている場合は最新版(Tiger 対応版)にアップデートして確認

こんな感じでしょうか。

ちなみに紹介先を拝見しましたが、Safari、Firefox ともに安定していました。

http://question.excite.co.jp/kotaeru.php3?q=1906698

この当時のまま、ということなんですよね?
改めてトピックを立てるのであれば、
せめて前回試された事くらいは併記するべきでは?
過去記事の存在を知らない方は同じ事を教えて下さるかもしれませんので、
その情報はあなたにとっては必要の無いものでしょうし、
時間を割いてご教示して下さった方にも申し訳が立たないでしょうからね。

さて。

【実行済み…と思われるもの】以前に提示した方法

・Safari のキャッシュクリア
・com.apple....続きを読む

Qプロセスの終了コードについて教えてください

プロセスがメモリのアクセス違反などで落ちた場合、
プロセスの終了コードにはどんな値が入ってくるのでしょうか?
その値はどこかのヘッダで定義されているのでしょうか?

質問の経緯としては、、、
プロセスAは終了時、終了コードをセットして終了します。
で、プロセスBで終了コードをチェックしているのですが、
この場合、アクセス違反などで異常終了したときの終了コードと
プロセスAが設定する値がぶつからないか心配になるり、
質問させていただきました。

識者の方、よろしくお願いします。

Aベストアンサー

こんにちは。itohhといいます。

>アクセス違反などで異常終了したとき
基本的に例外処理を行っていないとシステムで「デバッグするか?」というダイアログを
表示してしまいます。

わたしがよく使う方法は。
例外処理(try、catch)で例外エラーを拾います。そして、エラーコードとメッセージを
取得してexit関数で終了コードを指定するようにします。
(実際のエラーコード、エラーメッセージはNTのイベントログに出力する)

例えば。
正常終了なら0。
異常終了なら1。(エラーによって詳細に分けても良いです。)
などです。

これで、終了を監視しているプロセスで統一したコードが渡ります。

こんな方法では如何でしょうか?

try、catchの使い方は、MSDNライブラリを参照してください。


人気Q&Aランキング

おすすめ情報