Friday, December 30, 2011

「Firefox は起動していますが応答しません」を解決するアドオンを作ってみた

Windows版のFirefoxで突然以下の現象が発生するようになった。
  1. Firefox起動中にExplorerでhtmlファイルをダブルクリックしたり、Skypeで送られてきたURLをクリックすると「Firefox は起動していますが応答しません...」が表示される。
  2. Firefoxを起動していない時にExplorerでhtmlファイルをダブルクリックすると「xxx が見つかりません。名前を正しく入力したかどうか...」が表示される(但し、ファイルは正常に開く)。
原因を調べてみると、
  1. Firefox起動時に、Firefox自身が作成するDDEサーバが何らかの理由で作成に失敗している。このため起動元はFirefoxが起動中であることを認識できず、複数起動してしまい、結果同エラーが起きている。
  2. 理由はよく分からないが、エラーを表示しているのはExplorerのようだ(エラーダイアログの所有者はUSER32.dllだった)。
Windowsに別のユーザを作成し、そちらのユーザでログインすると上記の2つの問題が解決することが確認できた。しかし、現行ユーザのままで使いたい。。。
という訳で、解決するためのアドオンを作成してみた。
解決方針は、
  1. Firefox起動時に、独自のアドオンから独自のWindowsアプリを起動し、そこでDDEサーバを立てる。独自のアドオンと独自のアプリはSocketで通信する。
  2. (原因が分かっていないので)前述の独自アプリ起動直後に「名前を正しく入力したかどうか」のエラーが表示されていたら、WM_CLOSEでメッセージを閉じる(一瞬エラーは見えるし、音は鳴るしで、スマートな解決からは程遠い...)。
とりあえず、自分の環境(Windows XP)では治まったようなのでアドオンを公開します。
以下を右クリックして「名前をつけてリンク先を保存」し、Firefoxのアドオンマネージャのウィンドウにドラッグ&ドロップしてください。

NotYetRunning10.xpi

アドオンからアドオンフォルダ内の独自EXE(dde2socket.exe)を起動しているので、VistaやWin7な人はUAC認証が必要かも知れません。なお独自EXEはFirefox起動と同時に起動し、それらしいアイコンがタスクトレイに表示されます。そしてFirefox終了と同時に終了します。