VC++でのXPCOM作成(その3)

はじめに

 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>

カテゴリー「VC++ TIPS」 のエントリー