@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

WinFormアプリが突然消える!?

1
投稿者投稿内容
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-01-14 23:53
C#で開発したWinFormアプリをWinXP上で使用していますが、このWinFormアプリが突然消える(強制終了される)現象を何度か確認しています。

ただし、アプリ内で例外が発生して落ちている訳ではありません。「ハンドルされていない例外が発生した」というダイアログなどの表示は一切されません。本当に突然消えてしまいます。
また、WinXPのシステムログには何のログも残されていません。

このWinFormアプリは、System.Windows.Forms.TextBoxを複数行にして使用していますが、100KB程度のテキストをセットしてから表示させるとアプリが突然消えてしまいます。確か100%の確率です。

私自身、.NETより前のWindowsアプリの開発経験があまりないので良くわかりませんが、.NETより前のWindowsアプリのTextBoxでもこのような問題があったのでしょうか?
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-01-17 15:03
追加です。

先に書いたように例外が発生せずに突然落ちることもあれば、例外が発生することもあるようです。この2つの違いについては詳しくはわかりません。実行環境側の問題なので。

取り敢えず、「テキストをセットしてからフォームを表示」していたのを「フォームを表示してからテキストをセットする」ように処理の順番を変更したところ、解決しているみたいです。

しかし、例外が発生せずにいきなり落ち、OSのログにも残らないというのは、実行環境の信頼性にも関わる問題でもあり、怖い部分ですね。
フォームを表示する前に重い処理はするなということなのかな??

[ メッセージ編集済み 編集者: 二天 編集日時 2003-01-17 15:09 ]
rucio
ベテラン
会議室デビュー日: 2002/11/27
投稿数: 98
投稿日時: 2003-01-17 15:51
こんにちは。
APIやAcriveX、Unmanegedコード、サードパーティー製のコンポーネントは使用していないのでしょうか?

100%発生するというところに興味があります。
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-01-17 17:15
> APIやAcriveX、Unmanegedコード、サードパーティー製のコンポーネントは使用
> していないのでしょうか?

> 100%発生するというところに興味があります。

アプリ自体はWin32 APIを使っている部分はありますが、落ちる部分に関しては一切使用していません。.NETで提供されているTextBoxに100KB程度のテキストをセットし、その後にフォームを表示しているだけです。

不思議なのは、同じアプリ(同じビルド)で今日試したら例外が発生したのです。それまで例外をcatchできないし、ハンドルされていない例外ダイアログも出ないのでおかしいと考えていたのですが。
違いといえば、それまで100KB程度だったテキストを400KB程度に増やしたことくらいです。極端に大きいテキストだと例外が発生し、100KB程度だといきなり落ちるということですかね??

例外のメッセージは以下の通りです。

System.ComponentModel.Win32Exception: ウィンドウのハンドルを作成中にエラーが発生しました。
at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.TextBoxBase.CreateHandle()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmShowWindow(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
rucio
ベテラン
会議室デビュー日: 2002/11/27
投稿数: 98
投稿日時: 2003-01-20 11:11
うーん。
こちらでも似たようなプログラムを作ってみましたが正常でした。
ただし、VB.NET on Windows2000です。

具体的なプログラムを見ないとこれ以上はなんともいえませんが
同じビルドなのに実行したときによって現象が違うということは
ハードに問題があるのかもしれませんね。
たとえばメモリが壊れていると実行するたびに違うエラーになる
ことがありますよね(経験談)。
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-01-20 11:59
> こちらでも似たようなプログラムを作ってみましたが正常でした。
> ただし、VB.NET on Windows2000です。

テキスト情報は、メモリにあるものを一気にTextBox.Textプロパティでセットし、その後すぐにTextBox内のテキスト選択を解除するために以下のように指定してはいます。

TextBox.SelectionLength = 0;


> 具体的なプログラムを見ないとこれ以上はなんともいえませんが
> 同じビルドなのに実行したときによって現象が違うということは
> ハードに問題があるのかもしれませんね。
> たとえばメモリが壊れていると実行するたびに違うエラーになる
> ことがありますよね(経験談)。

例外を見る限り、表示前の処理で引っかかっているみたいなので、もしかしたら上記選択解除の指定をフォームの表示前に行うことが悪いのかも知れません。ヘルプにはその辺りの記載はありませんが。

例外をcatchできる時といきなり落ちる時の違いに関しては謎のままですが、.NETはJavaと違ってコアAPIのソースが公開されていないので、その辺りは開発者が独自に見つけて行くしかないのかも知れません。
しかし、開発者に取ってAPIがブラックボックスであると不便なことが多いですね。
1

スキルアップ/キャリアアップ(JOB@IT)