Windows XP SP2(日本語)上で、VC++6.0で開発したアプリケーションを動かしていました
これらをVC++8.0でビルドしたとこと、処理する実行ファイルが、エラーダイアログを表
示するようになりました
実行ファイル名がエラーダイアログのタイトルで、MSにエラーが起きたことを送信するか
しないかを選択できるダイアログです
このダイアログが表示されるようになったのは、VC++6.0からVC++8.0でビルドしたことに
よる違いでしょうか???
根本的にエラーがおきている現象も追いかけていますが、まずは、ダイアログが表示され
るようになったことが、VC++6からVC++8.0に換えたことによるものでないか知りたいのですが
もともとソースにバグがあったものと思われます。
VC6ではたまたま動いていただけ。
> このダイアログが表示されるようになったのは、VC++6.0からVC++8.0でビルドしたこと
> による違いでしょうか???
エラーの内容がわからないので断言できませんが、その可能性はあります。
が、それは必ずしも、6.0 の頃は正しくて、8.0 にしたら何かおかしくなったということ
だとは限りません。
むしろ、バージョンが上がったことで処理がより厳格になり、6.0 の頃は見過ごされてい
たバグが浮かび上がってきたという可能性が高いのではないかと思われます。
VC++6.0では落ちています
が、ダイアログは表示されていないため、他のプロセスから再起動させて処理を続けさせ
ています
よって、既存にバグがあることは分かっています
落ちることは問題ではなく、ダイアログが表示されることのみが問題です
Windows は「落ちることは問題ない」ということ想定していないんじゃないですか?
> 根本的にエラーがおきている現象も追いかけていますが、まずは、ダイアログが表示され
> るようになったことが、VC++6からVC++8.0に換えたことによるものでないか知りたいの
ですが
何を聞きたいのか分かりません。
「VC++6からVC++8.0に換えたことによるもの」なのは明らかでしょ?
マイクロソフトの中の人ではないので憶測ですが、
次のように理解して大きな問題はないと思います。
・VC6では、プログラムの異常終了は放置されていた。
・VC8では、異常終了をMSに通知する仕組みが採用されている。
異常終了の種類やコンパイルオプションや、OSやその設定などにもよると思いますので、
正しく理解する必要があるなら調べてください。
で、結局のところデバッグするしかないと思うのですが、
ひょっとして、ダイアログを表示させない方法を聞いています?
たいちょうさま
知りたいことはお答えいただいた
・VC6では、プログラムの異常終了は放置されていた。
・VC8では、異常終了をMSに通知する仕組みが採用されている。
です
製品として出すもので、近々展示を行います
なぜ、VC++8.0に換えたことで、エラーダイアログが出たのか?が最大の注目点です
>ダイアログを表示させない方法を聞いています?
そこまではまだ考えられていませんでしたが、確かに、ダイアログさえ出なければ実害は
ありません
taniさま
おっしゃる通りだと思います
ここで相談させているアプリケーションはお客様に使っていただくもので、特定のフォル
ダに置かれたファイルを画像処理を行って、更新するものです
例えば、ファイルの入力が、10万点あった場合に、数日処理にかかります
お客様が困るのは、画像ファイルが壊れていたりなんらかの問題があったとしても、処理
が停止してしまうことにあります
1点目の処理でハングアップして処理を停止し、数日後に確認したら、1点も処理が終わっ
ていないということは避けなければなりません
1点目は処理に失敗したが、99999点は完了していたいです
そこで、実行ファイルが何らかのトラブルで落ちた場合にも処理が続けられう事が最大の
課題です
もちろん、正しくエラー処理ができればそれに越したことはありませんが、総開発ステッ
プ数が、数十万行あり、多くのライブラリを使用していますので、改修には非常にコスト
がかかります
そのため、処理を行う実行ファイルが、ハングアップした場合に、終了させるプロセス
と、起動していない場合に起動させるプロセスを持っています
最大の関心ごとは、エラーダイアログが出てしまうことに尽きます
よって、エラーダイアログがなぜ出るようになったかの理由が知りたいので
製品として出すものなのに異常終了は放置されていたのか?
VC8ではなくOSとかがウィンドウ出しているんじゃないの?
ところでVC6って異常終了しても
何もなくプログラムが終わる仕様だっけ?
それって
たまたまそうなっただけのような気がする。
# 異常終了といってもいろいろあるが、なんですか?
# 偶然変なアドレスにアクセスするタイプだと
# 偶然アクセス可能な場所を指している場合
# 変なデータに変えてしまい
# そのままプログラムが動き続ける可能性もあるので
# それをOKとするのはわからない。
#
# VCのどのバージョンからは知らないが例外のキャッチが変わっています。
# すべての例外をcatch(...)で握りつぶしていた場合は
# 設定を変更しないと握りつぶせなくなっている。
# でもこれは関係ないか。
関係ないけどすべての例外を握りつぶして終了すれば解決?
# 与太話
# そんなアプリの特徴を書いちゃって…
# お客さんがここ見てたらどうしましょう?
俺が使っているのはVS 2008だった。
VC9らしいね。
先ほどの書き込みと以下の書き込みはVC8で通用するのかわかりません。
いろいろ細かいことが気になるけど
細かくtryで範囲を限定しているとか、
エラーログを出しているとか、
......
その辺は既に考えているとして、
try { 問題の処理 } catch(...) { exit(エラーコード); }
そして/EHaでコンパイルする。
で握りつぶせるよ。
VC6 で実験したら何も出なかったので、多分 OS だけでなく VC8 のランタイム
がダイアログの表示を指令しているかもしれません。
>VC8ではなくOSとかがウィンドウ出しているんじゃないの?
出しているのはOSというべきでしょうか?
VC8になったことで、ラインタイムが変わっていため?
異常終了は、例えばファイルによるものとこか・・・
ファイルの壊れて後半がなくなっていたりして、ヘッダにある情報でデータを取りにいけ
ないとか・・・
どんなソフトでファイルを編集したかは分かりませんが、タグの情報をありえないもの
だったりすると、使用しているライブラリによっては落ちます
大体はcatchできますが・・・
エラーダイアログが表示されるケースをMSのサイトから調べてみます
>ダイアログさえ出なければ実害はありません
であれば、SetUnhandledExceptionFilter()で
トップレベル例外ハンドラを置き換えてみればいかがでしょうか
シャノンさま
># お客さんがここ見てたらどうしましょう?
特に問題はありません
処理できなくてアプリケーションが落ちてしまった場合、そのファイルは処理できなかっ
たかはログに管理されています
例えば、ユーザは、10万点処理したうち、3点処理に失敗したことが分かることは当然重
要です
開発にフィードバックします