今日のゴミ.Debian で,どこの libxpcom.so を読み込ませればよいのかわからなかった… もう何時間を無駄にしたことやら.
GRE
動的ライブラリに直リンしないで GRE_GetGREPathWithProperties() 使えって話だけど,そもそも情報が無さ過ぎてよくわからんのう.
xulrunner を起動すると…
$ xulrunner --find-gre 1.8.0.1 /usr/lib/xulrunner/libxpcom.so
とかなるから,これかと思ったんだけど,ぜんぜん違うみたい.SEGV っちゃう.
//g++ -g -I/usr/include/iceape -I/usr/include/nspr test.cpp -lxpcomglue
// library memo // /usr/include/nss : Network Security Services // /usr/include/nspr : NetScape Portable Runtime #include <xpcom-config.h> #define XPCOM_GLUE 1
#include <stdio.h> #include <nsEmbedAPI.h> #include <nsILocalFile.h> #include <nsCOMPtr.h> #include <nsStringAPI.h> #include <nsXPCOMGlue.h> int main() { // Gecko Runtime Environment (GRE) の起動 nsresult rv = XPCOMGlueStartup("/usr/lib/xulrunner/libxpcom.so"); if(NS_FAILED(rv)) { fprintf(stderr, "Fail : XPCOMGlueStartup().\n"); return rv; } nsCOMPtr<nsILocalFile> gredir; rv = NS_NewNativeLocalFile(nsCString("/usr/lib/xulrunner/"), PR_FALSE, getter_AddRefs(gredir)); if(NS_FAILED(rv)) { fprintf(stderr, "Fail : NS_NewNativeLocalFile().\n"); return rv; } /* EmbedAPI.o が必要らしい… rv = NS_InitEmbedding(gredir, nsnull); if(NS_FAILED(rv)) { fprintf(stderr, "Fail : NS_InitEmbedding().\n"); return rv; }
// GRE の停止 rv = NS_TermEmbedding(); if(NS_FAILED(rv)) { fprintf(stderr, "Fail : NS_TermEmvedding().\n"); return rv; } */ rv = XPCOMGlueShutdown(); if(NS_FAILED(rv)) { fprintf(stderr, "Fail : XPCOMGlueShutdown().\n"); return rv; } return 0; }
あと,もしかして,NS_InitEmbedding/NS_TermEmbedding って,Debian の開発パッケージ (libxul-dev とか) に含まれてない… ? 結局 mozilla 自前でビルドしないと駄目なのかなぁ.とんでもないデカさだから,面倒なんだけど.
■ エンベッディングライブラリの初期化
エンベッディングライブラリの初期化/終了には、
nsresult NS_InitEmbedding(nsILocalFile *mozBinDirectory, nsIDirectoryServiceProvider *appFileLocProvider); nsresult NS_TermEmbedding();
を使用します。
定義は、nsEmbedAPI.h、実体は、EmbedAPI.o、EmbedAPIDebug.o にあります。モジラ本体のデフォルトビルドでは生成されないので、本体ビルド後に自分で、
mozilla/embedding/base/macbuild/EmbedAPI.mcp
にてビルドします。
Gecko Embedding を動かすだけで,エライ大変だ.とりあえず XPCOM 単体 (stand alone 版)の使いかたを覚える方が良さそうだなぁ… ns が絡んでくると一気に面倒になってくるから.
|