拡張機能のための C++ XPCOM Components 作成 でハマったときの記録

http://firefox.geckodev.org/index.php?XPCOM%E3%81%AE%E4%BD%9C%E6%88%90の「C++XPCOM on Linux 」を見ながら、同じものを作成してみたのですが、サンプルの機能を実行すると「Components.classes[cid] is undefined」と表示されて実行できないでいました。調べてみたところ、作成したXPCOM Componentが登録されていない、あるいはComponentが何らかの原因でロードに失敗していると思われ、その原因が分からず3日間くらいハマってました。

解決の糸口が見えず、たまたま
http://labs.gmo.jp/blog/ku/2008/01/firefox3cxpcom.htmlを見ていたところ、気になる記述があり試してみると、ちゃんとXPCOM Componentの機能が呼び出されました。

修正した箇所は、http://firefox.geckodev.org/index.php?XPCOM%E3%81%AE%E4%BD%9C%E6%88%90Makefilehttp://labs.gmo.jp/blog/ku/2008/01/firefox3cxpcom.htmlによると、extensionやXULRunnerアプリケーションコンポーネントを作るときはlibxpcomglueではなくlibxpcomglue_sをリンクするとのこと。リンクするライブラリをlibxpcomglueからlibxpcomglue_sにリンクし、自作の拡張機能をインストールし直したところ正常な結果が得られました。

これだけにかなり時間がかかったので、ホッとしています。

エラーコンソールを見ると、XPCOMUtils.jsmのところで「i is undefined」と出ていて、まだ気持ち悪い部分もありますが。