C#でNS_InitEmbedding
Gecko組み込みアプリでは、まずGeckoを初期化する必要があります。そのために必要な処理を行ってくれる関数がNS_InitEmbeddingです。
nsresult NS_InitEmbedding(nsILocalFile *aMozBinDirectory, nsIDirectoryServiceProvider *aAppFileLocProvider);
この関数宣言を見ても分かるように、Mozillaをインストールしたディレクトリを表すnsILocalFileオブジェクトを引数に与える必要があります。どうしたものかと困って
$ strings libxpcom.so | grep -v "^_" | grep -v "^PR_" | grep -v "^PL_" | lv
とかして、libxpcom.soのシンボルを探ってたら、NS_New{Native,}LocalFileなる関数を発見。これはXPCOMやGeckoが初期化される前から安全に利用できるとされている関数で、これを使ってnsILocalFileを作ることが出来そうです。
http://lxr.mozilla.org/mozilla/source/xpcom/build/nsXPCOM.h#187
また、もう一つの引数であるnsIDirectoryServiceProviderは、nsnullを与えても良いようなので、とりあえずはnullを与えておくことにします。
むぅ…。NS_NewLocalFileを使うのはいいとして、その引数であるnsAStringを作るのに苦しんでみたり。たかが文字列、されど文字列というか、文字列クラスを作るC関数を用意して置いて欲しいとか思った今日この頃…。とか更に見ると、nsILocalFileの引数もnullでいいそうな…。
で、とりあえず最小の例。DllImport属性では組み込みに関連するDllの名前がプラットフォーム毎に違うので、Windowsのものにあわせておいて、MonoのほうでDllmapするのがよさそうかも。
using System; using System.Runtime.InteropServices; unsafe class MonoEmbed { /** * nsresult NS_InitEmbedding(nsILocalFile *aMozBinDirectory, * nsIDirectoryServiceProvider *aAppFileLocProvider); */ [DllImport("gtkembedmoz")] private static extern uint NS_InitEmbedding(IntPtr aMozBinDirectory, IntPtr aAppFileLocProvider); /** * nsresult NS_TermEmbedding(); */ [DllImport("gtkembedmoz")] private static extern uint NS_TermEmbedding(); static void Main() { NS_InitEmbedding(IntPtr.Zero, IntPtr.Zero); NS_TermEmbedding(); } }