AdobeのPDFビューア「Adobe Reader 7.0」
このソフト自体は結構軽量化されてそれまでのものより使いやすくなってますが、実はとんでもない問題点があります。
シェル拡張DLL「pdfshell.dll」に重大(?)な欠陥が存在しています。
これは製品開発してて挙動が不審だったので調査したんですが、以下のような状況が発生したときに、そのアプリケーション自体が落ちてしまう問題があります。
- ソフトウェアよりファイル選択ダイアログを表示
- ツールチップを表示させます
- その後の処理はキャンセルなり継続するなり勝手にし、ダイアログを閉じます
- 再度ファイル選択ダイアログを表示させます
- このとき、再度ツールチップを表示させるタイミングでアプリがメッセージなく落ちます
ちなみに、notepad.exeでも同じ現象が発生するのでとんでもなくやっかいです。
ググると、XP SP2 + Adobe Reader7.0 がキーワードらしい。
この挙動、「pdfshell.dll」がメモリを上書きしていることによる現象らしく、ユーザレベルでの根本的な回避は無理です。
もちろん、
- ツールチップを表示しないようにする(エクスプローラより設定変更可)
- pdfshell.dll を使用しないようにする(DOS窓よりコマンド発行すればできます)
- Adobe Reader 6以前を使用する
- PDFを見ない(マテ
とかすれば回避はできるんですけどね。
ってことで、改めて調査してみると、回避できそうな方法があるらしい?ということで、来週会社でクライアントいじるときに試してみるメモをおいときます。
アプリケーションでGetOpenFileNameをコールする前に
CoInitialize(NULL);
でCOM初期処理をしておくとクラッシュしないようです。
試してみました。
適切な箇所に、COMコンポーネントの初期化である CoInitialize(NULL); および 解放時に CoUninitialize(); を入れることで回避可能であるようです。
# もちろん、製品に組み入れるかどうかは別の話だけどね。