はじめに
Firefox(Mozilla)などの機能をC++によって拡張することができるXPCOMの作り方を紹介する。 ここでは作成したXPCOMのインストールとテスト方法方法についてを記す。インストール用パッケージの作成
Firefoxにはxpiという形式での拡張のインストール方法が用意されている。このxpiというのはzipの 拡張子をxpiに変更しただけのもので、ファイル圧縮ソフトで作成することができる。以下の内容でzipファイルを作成し、ファイル名を「xxx.xpi」に変更する。
install.rdf components\Ixxx.idl components\Ixxx.xpt components\Ixxx.dll chrome\xxx.jar
この中で「Ixxx.idl」、「Ixxx.xpt」、「Ixxx.dll」は前項で作成したXPCOMのコンポーネントになる。
「install.rdf」の内容については後述する。
xxx.xpiの中にあるxxx.jarというのもxpiファイルと同じでzipファイルの拡張子を変更したものになる。
以下の内容でzipファイルを作成し、ファイル名を「xxx.jar」に変更する。圧縮内容の2つのファイルの 内容については後述する。
content\xxx\contents.rdf content\xxx\xxx.xul
xpiのインストール
Firefoxのウインドウの中にxxx.xpiをドラッグ・アンド・ドロップする。するとインス トールを問うダイアログが表示される。ここからインストールして一度Firefoxを終了すれ ばいい。実行テスト
インストールしたXPCOMおよびエクステンションをテストするにはアドレス欄から以下の URLを開く。chrome://xxx/content/xxx.xul
正常にインストールされている場合、このURLを開くとボタンが2つ表示される。このボタ ンを押すとインストールしたXPCOMが実行され「15」や「5abcdefg」というメッセージが表示 される。
install.rdfの作成
<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<rdf:Description rdf:about="urn:mozilla:install-manifest">
<em:id>{503B265E-04B9-49fd-AD47-B477294302D9}</em:id>
<em:homepageURL>http://www.dinop.com/vc/</em:homepageURL>
<em:creator>issei</em:creator>
<em:name>Ixxx</em:name>
<em:version>1.0</em:version>
<em:description>VC++ XPCOM Ixxx</em:description>
<em:targetApplication>
<rdf:Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>1.0</em:minVersion>
<em:maxVersion>1.0+</em:maxVersion>
</rdf:Description>
</em:targetApplication>
<em:file>
<rdf:Description rdf:about="urn:mozilla:extension:file:xxx.jar">
<em:package>content/xxx/</em:package>
</rdf:Description>
</em:file>
</rdf:Description>
</rdf:RDF>
※太字で強調している部分はVC++に含まれるGuidGen.exeを使って新しいGUIDを生成して利用 する。同じ値を使いまわしてはいけない!
contents.rdfの作成
<?xml version="1.0" encoding="utf-8" ?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:chrome="http://www.mozilla.org/rdf/chrome#"> <rdf:Seq rdf:about="urn:mozilla:package:root"> <rdf:li rdf:resource="urn:mozilla:package:xxx"/> </rdf:Seq> <rdf:Description rdf:about="urn:mozilla:package:xxx" chrome:extension="true" chrome:author="issei" chrome:authorURL="mailto:dinopcom@gmail.com" chrome:displayName="Ixxx 1.0" chrome:name="Ixxx" chrome:description="VC++ XPCOM"> </rdf:Description> </rdf:RDF>
xxx.xulの作成
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/css" href="chrome://global/skin/" ?>
<page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript">
<![CDATA[
function OnTest1()
{
var obj = Components.classes["@mydomain.com/xxxxxxx/Ixxx;1"].createInstance(Components.interfaces.Ixxx);
var ss = obj.Add(11,5);
alert(ss);
}
function OnTest2()
{
var obj = Components.classes["@mydomain.com/xxxxxxx/Ixxx;1"].createInstance(Components.interfaces.Ixxx);
var ss = obj.AddString("abcdefg",5);
alert(ss);
}
]]>
</script>
<vbox>
<hbox>
<button label="Test1" oncommand="OnTest1();" />
<button label="Test2" oncommand="OnTest2();" />
</hbox>
</vbox>
</page>







