ファイル選択ダイアログで落ちる / ファイル選択ダイアログで落ちる(2) / ファイル選択ダイアログで落ちる(3) / ファイル選択ダイアログで落ちる(4) / 日本語の作文技術

投稿日: 2005年05月29月

2011.6.9追記:

結論から書くと、アプリケーション中で一回CoInitialize(NULL);を実行しておけば良いです。

ファイル選択ダイアログで落ちる

ダイアログにボタンを置いてファイル選択ダイアログ(CFileDialog)を表示させる。これを2回繰り返しただけで落ちる現象に悩まされている。

再現手順はこう。

  • ダイアログ上のファイル選択ダイアログを開く。
  • ファイル選択ダイアログのファイル(フォルダでは再現しない)上にマウスカーソルを持っていきツールチップを表示させる。
  • キャンセルしてダイアログを閉じる
  • 再度ファイル選択ダイアログを開きマウスーカーソルをファイルの上に持っていくとツールチップが表示…されずに落ちる。

表示しているファイルも、デスクトップでは出るが他のフォルダでは再現しない。

Release版だとエラーメッセージすら出ない。デバッグ版では次のメッセージが出る。「ハンドルされていない例外はhoge.exe(SHELL32.DLL)にあります:0x0000005: Access Violation。」

最初はOPENFILENAME構造体の違いで発生するのかと思ったが、微妙。

SHELL32.DLLで出るということはシェル拡張アプリケーションがファイルの情報を表示するときに例外を発生させているのかとも思えたり。もしそうだとしたらクリーンな環境のPCでは再現しない可能性がある。帰ったら試してみる。

困ったことに自分で作っているアプリでなくても発生する。やっぱりThinkPadの環境が腐ってきたのかも。

次に身の回りのツールで検証してみた。

  • putty 0.54の設定画面で発生。ソースを見るとdswがあるのでVisual C++ 6.0以前を使っているっぽい。MFCは見当たらず、APIのみで表示しているのではないだろうか。
  • Wake up On Lan tool ver.1.93で発生。
  • WWWCでは発生せず。開発環境はおそらくVisual C++ 6.0。ただしMFCを使わずAPIのみ。
  • TortoiseSVNでは発生せず。開発環境はVS.NETとMFC。
  • xyzzyでは発生せず。開発環境はVC++6.0以前と思われる。MFCは使わずAPIのみ。

ファイル選択ダイアログで落ちる(2)

ス切りボでも発生せず。ス切りボはVC++6.0とMFCでビルドされているがファイル選択ダイアログはAPIで表示している。(GetOpenFileName)

TortoiseSVNは全体的にMFCを使っているがファイル選択はAPIを使っていた。

どうも、APIを使った場合は落ちないらしい。それではMFCを使っていないであろうputtyは?というと、よく見たらGtkを使っているので、また状況が違う。

それでは、codeproject等に登録されているCFileDialog代替クラスは大丈夫なのではないだろうか。OPENFILENAME構造体のサイズも意識しているものもあるし。(この構造体が原因かどうかはわからないけど)

比較的シンプル。が、落ちた。ちなみにこいつはダイアログベースではない。

OSの自動検出までできるっぽい。が、落ちた。

これも比較的シンプル。でも落ちた。

ボタンの位置とかずれまくり。が、落ちない。

まだそれぞれのコードは見てないので原因は不明。

ファイル選択ダイアログで落ちる(3)

おとなしくファイルオープンだけAPIで書くか。本当はもうMFCごと捨てたいけど。

そもそも原因がThinkPadの環境(インストールしているシェル拡張アプリ)とか、Windowsのバグとかいろいろ考えられるがそんなことはどうでもよく、問題なのは落ちるアプリと落ちないアプリがあるってことだ。一律落ちるならこんなことに時間をかけないで諦める。

API使ってもひょっとして落ちないだけでリソースを食いつぶしてるのかもしれないけど、それはそれ、これはこれだ(なげやり)。もしそうだとしてもそれはアプリケーション側で対処するのは難しいと思う。それにファイルダイアログごときにこれ以上時間をかけるわけにもいかない。

追記:miechは大丈夫だった。CFileDialog使ってるのになんで?と思ったら、WTLのCFileDialogだった。WTLヽ(´ー`)ノマンセー(本当は.NETだからなのかも)

さらに追記:VC.NET 2003(MFC7.0だっけ?)のCFileDialogでも落ちた。

ファイル選択ダイアログで落ちる(4)

やっぱりというかなんと言うか、家のデスクトップ(Windows XP SP2)では落ちない。

OSは開発環境であるThinkPadと同じWindows XP SP2なので後はインストールされているソフトウェア、特にシェル関連のソフトが怪しい。

というわけでデスクトップに無く、ThinkPadにインストールされているソフトをShellに近いものから入れていく。

まずはTortoiseSVNをインストール。再現せず。次にTortoiseCVSとAdobe Reader 7.0。ビンゴ、再現した。AdobeReader 7.0をアンインストール。再現せず。こいつかYO!!確か7.1アップデータが出てたはず、入れてみるが再現する。

念のためThinkPadのAdobe Reader 7.0を削除すると、落ちなくなった。決定的。Adobe Readerだけのバグではなく、複合的な要因によるものかもしれないけど、とりあえずAdobe Reader 7.0を入れてない状態では落ちないことが確認できた。

ちなみにAdobe Readerを疑ったのはファイル選択ダイアログのファイルにカーソルを当てたときにデバッグウインドウに次のメッセージが出たから。

'C:\Program Files\Adobe\Acrobat 7.0\ActiveX\pdfshell.dll' をロードしました、
合致するシンボル情報は見つかりませんでした。

あぁ、シェルに居るのか。と。もちろん他にもいろいろ居るんだけど(zipを解凍するためのDLLもちょっと疑った)ひときわ目立った。

けどやっぱり気になるのは「すべてのアプリケーションで落ちるわけではない」ということ。しかも今APIで(落ちないアプリと同じように)作ったのに落ちるし…。API使ってるはずのFFFTPも落ちるし…。あ、メモ帳も落ちた。もう嫌になってきた。

日本語の作文技術


この記事へのコメント

※ このコメントは旧ブログシステム(tDiary)からの移行です。

元◇318MT将軍さんからのコメント(2006-05-11 19:33:39)

もう解決しているかもしれませんが、この人の解決策がつかえると思います。http://www.geocities.co.jp/Athlete/8625/tokubetuhen.htmlofn.hwndOwnerに親ハンドルを入れないと少しおかしな動きになります。

10年目SEさんからのコメント(2006-05-17 15:24:33)

私も同じ現象が発生しました。私の場合は、Acrobat 7.0とDevPartnerが同一PCにある場合に発生しました。Acrobat 7.0をアンストールしたら、正常にもどりました。なんでなのかさっぱりわかりません。

hajimeさんからのコメント(2006-05-17 18:52:23)

http://www.bea.hi-ho.ne.jp/cgi-bin/user/byoko/bnews?f=b&p=32610に解決策が掲載されています。具体的にはアプリケーション中で一回CoInitialize(NULL);を実行しておけば良いとのことです。最近は僕もこの方法を使っています。

名前:宮内 はじめ

Code for Nagoya名誉代表

E2D3名古屋支部長

プログラマーです。GISやデータビズが好きです。このサイトは宮内の個人的なメモです。

プロフィール

お問い合わせ