• 締切済み

DOS窓を閉じる×ボタンを押された際のハンドリング

DOS窓を閉じる右上の×ボタンを押された際のハンドリングを知りたいです。この×ボタンを押すとatexitで登録した関数やC++のデストラクタが呼ばれないのです。 どのように調べても情報が出てきません。 これはどのようにすれば良いか関数やキーワードだけでも良いので情報お願い致します。

みんなの回答

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.2

おかしいな。VC++2008で、finish関数にブレークポイントを張って、 デバッガから起動して、DOS窓を×で閉じると、ちゃんとブレークするよ。 もしかして、プログラムが応答していません、の状況になって、 強制終了させたときの話をしてる? そのときは、おそらく強制的にプロセスを終了させるだろうから、 呼ばれないかもしれないけど。

caps2
質問者

補足

>強制終了させたときの話をしてる? 状況からして考えてみますと仰せのとおり強制終了だと思います。気づきませんでした。 状態はscanf待ちの時に×を押していました。帰宅後検証してみます。

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.1

>この×ボタンを押すとatexitで登録した関数やC++のデストラクタが呼ばれないのです。 どうやって確認したんですか? DOSを起動してプログラムを実行したんですよね。 以下のプログラムをコマンドプロンプトから実行して、 getc(stdin)で待ち状態にし、DOSプロンプトを×で閉じたら、 ファイルにfinishedと書き込まれましたよ。 #include <stdio.h> #include <stdlib.h> FILE* fp; void finish() {   fprintf(fp, "finished\n");   fclose(fp); } int main(void) {   fp = fopen("D:\\test.txt", "wt");   if( fp == NULL ) {     printf("ファイルオープン失敗\r\n");     exit(-1);   }   atexit(finish);   if( getc(stdin) == 'q' ){     printf("Exit\n");     exit(-1);   }   return 0; }

caps2
質問者

お礼

検証に感謝いたします。 Visual Studioのデバッガで調べていました。 確かに上記のプログラムで希望通りの動作を確認いたしました。 まだ確信は持てませんが、どうやらデバッガの特性で×ボタンを押された際すぐにプロセスを解体させてデストラクタやatexitの所まで行かずに終了してしまうようです。 これが本当でしたらお騒がせしまして申し訳ございません。

関連するQ&A