PC関係のメモ
ファイル選択ダイアログで落ちる / ファイル選択ダイアログで落ちる(2) / ファイル選択ダイアログで落ちる(3) / ファイル選択ダイアログで落ちる(4) / 日本語の作文技術
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も落ちるし…。あ、メモ帳も落ちた。もう嫌になってきた。
日本語の作文技術
ホームページのお仕事(2) / アイデアを活かす環境
ホームページのお仕事(2)
前回と同じ更新モノの作業。画像編集、HTML作成、アップロード、報告まで含めて作業時間は1時間15分。
アイデアを活かす環境
「あ、これ作ろう」と思うのって大抵こんな時間(深夜3時)だったりする。昔ならここで作ってしまうんだけど、今は「明日会社だ。寝なきゃ」ということになる。
そういうときのアイデアってダメなモノも多いけど、たまにいいモノになったりもする。しかしこういうのって次の日の夜になるとやらなくて、週末時間があるときにやれるかっていうとそうでもない。
「よーし、会社で作っちゃおー」ということができるのがGoogleがやってるような「20%ルール」。制度化されていなくとも、そうできる環境を作れるかどうかというのは大事なことだと思う。
給料分働いたら、それ以降の時間を今はまだお金にならないけど将来への投資として発展的なことをする。平たく言うとやりたいことをやる。
それをするためには、会社として、
- 安定した収入の得られる業務
- お互いにサポートしあえる人材
が必須条件だと思う。
安定した収入の得られる業務は、できるならルーチンワークがいい。また、誰がやっても同じ成果になる仕事のほうがいい。それに楽しくなくてもいい。いわゆる「それが仕事だ」で割り切れる内容。
そして業務を円滑に回すためには人材も不可欠。一人では一人分しか稼げないし、会社が潤わない。イコール自分も潤わない。
これらの地盤が整って初めて「やりたいことができる」環境作りが始まると思う。
何が書きたかったかというとつまり、「明日会社だから早く寝なくちゃ」。(今4時)
日本語の作文技術 (朝日文庫)(本多 勝一)

_ 元◇318MT将軍 [もう解決しているかもしれませんが、この人の解決策がつかえると思います。 http://www.geocities.c..]
_ 10年目SE [私も同じ現象が発生しました。 私の場合は、Acrobat 7.0とDevPartnerが同一PCにある場合 に発生し..]
_ hajime [http://www.bea.hi-ho.ne.jp/cgi-bin/user/byoko/bnews?f=b&p=..]