用C++编写XPCOM组件
还是先开看看官网给的例子,下载示例程序 xpcom-test
配置方法见文章 https://developer.mozilla.org/en/How_to_build_a_binary_XPCOM_component_using_Visual_Studio
没有必要下载该文章中的Gecko-SDK,如果使用较新版本的xul-runner,使用它的SDK就可以了,
如果不使用Gecko-SDK,直接使用xul-runner的SDK,项目的一些配置需要修改:
1、项目属性中的"附加包含目录位置为(xul-runner dirpath)/sdk/include,“附加库目录为”(xul-runner dirpath)/sdk/lib
2、由于XPCOM需要使用xpidl工具生成.h和.xpt文件,每次用命令行的方式比较繁琐,可以使用该例程中的批处理文件,示例程序中的 xpidl-build.bat文件为执行该工作,设置项目属性中的“自定义生成步骤”->“命令行”->"xpidl- build.bat",这样在编译该项目的时候就会自动生成.h和.xpt文件
编译该项目,成功后生成的.dll文件和.xpt文件,现在我们来看看如何使用这个组件
测试组件
文章中介绍的测试组件方法写的太简单,完全摸不着头脑,经过不断的钻研,我提供出以下两种方法
方法一、通过网页调用
1、将dll和xpt文件放在FireFox的components目录下,windows下路径是C:/Program Files/Mozilla Firefox/components
2、删除profiles下的注册文件compreg.dat和xpti.dat,profiles在windows下路径 是%appdata%/Mozilla/Firefox/Profiles/**.default
3、重新启动FireFox,打开xpcom-test.html网页
xpcom-test.html代码
- <HTML>
- <SCRIPT>
- function Test() {
- try {
- // normally Firefox extensions implicitly have XPCOM privileges,
- //but since this is a file we have to request it.
- netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect" );
- const cid = "@starkravingfinkle.org/specialthing;1" ;
- var obj = Components.classes[cid].createInstance();
- obj = obj.QueryInterface(Components.interfaces.ISpecialThing);
- }
- catch (err) {
- alert(err);
- return ;
- }
- var res = obj.add(3, 4);
- alert('3+4 = ' + res);
- var name = obj.name;
- alert('Name = ' + name);
- obj.name = 'New Name' ;
- name = obj.name;
- alert('Name = ' + name);
- }
- </SCRIPT>
- <BODY>
- <INPUT TYPE="Button" Value= "Test" οnclick= "Test();" >
- </BODY>
- </HTML>
note:netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 这句话一定要加,否则没有效果,折腾一下午就因为这个没加,怎么也调不出来,这句话是用来授权使我们可以访问浏览器的API
方法二、使用xulrunner
需要在磁盘上建立如下结构的目录和文件
{appname}这个名字随便写,就是随便给目录起个名字作为根目录,下面用到的"|"表示目录的深度
|-application.ini
|-chrome
||--chrome.manifest
||--xpcom-test
|||---test.xul
|-defaults
||--preferences
|||---prefs.js
|-components 这个目录下放编译好的dll和xpt文件
||--comp.xpt
||--test.dll
application.ini文件
- [App]
- Vendor = AliciaLy
- Name = xpcomtest
- Version = 3 .0.5
- BuildID = 201002251
- [Gecko]
- MinVersion = 1 .9.0.5
- MaxVersion = 1 .9.1.*
chrome.manifest
- content tests xpcom-test/
test.xul
- <?xml version= "1.0" ?>
- <?xml-stylesheet href="chrome://global/skin/" type= "text/css" ?>
- <window id="controller-example" title= "Controller Example"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" >
- <mce:script type="text/javascript" ><!--
- function callXPCOM() {
- try {
- const cid = "@starkravingfinkle.org/specialthing;1" ;
- var obj = Components.classes[cid].createInstance();
- obj = obj.QueryInterface(Components.interfaces.ISpecialThing);
- }
- catch (err) {
- alert(err);
- return ;
- }
- var res = obj.add(3, 4);
- alert('3+4 = ' + res);
- var name = obj.name;
- alert('Name = ' + name);
- obj.name = 'New Name' ;
- name = obj.name;
- alert('Name = ' + name);
- }
- // --></mce:script>
- <button id="testXPCOM" label= "Test XPCOM" oncommand= "callXPCOM();" />
- </window>
如果这个文件中需要控件用中文显示,需要保存为utf-8格式
prefs.js
- pref("toolkit.defaultChromeURI", "chrome://tests/content/test.xul");
这些文件都写好后,需要用命令行进入xulrunner.exe目录下,位置是xulrunner-sdk/bin
输入命令xulrunner {appname dir}/application.ini
就可以看到窗口的左上方出现一个带按钮的新窗口