Welcom to zougangx's blog

坚持...积累... 编程是一门技术,更加是一门艺术

FireFox插件开发(二) --- 编写和使用XPCOM组件

用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代码

  1. <HTML>  
  2. <SCRIPT>  
  3. function  Test() {  
  4.     try  {  
  5.     // normally Firefox extensions implicitly have XPCOM privileges,   
  6.     //but since this is a file we have to request it.   
  7.     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect" );  
  8.     const  cid =  "@starkravingfinkle.org/specialthing;1" ;  
  9.     var  obj = Components.classes[cid].createInstance();  
  10.     obj = obj.QueryInterface(Components.interfaces.ISpecialThing);  
  11.   }  
  12.   catch  (err) {  
  13.     alert(err);  
  14.     return ;  
  15.   }  
  16.   var  res = obj.add(3, 4);  
  17.   alert('3+4 = '  + res);  
  18.   var  name = obj.name;  
  19.   alert('Name = '  + name);  
  20.   obj.name = 'New Name' ;  
  21.   name = obj.name;  
  22.   alert('Name = '  + name);  
  23. }  
  24. </SCRIPT>  
  25. <BODY>  
  26. <INPUT TYPE="Button"  Value= "Test"  onclick= "Test();" >  
  27. </BODY>  
  28. </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文件

  1. [App]  
  2. Vendor = AliciaLy   
  3. Name = xpcomtest   
  4. Version = 3 .0.5  
  5. BuildID = 201002251   
  6. [Gecko]  
  7. MinVersion = 1 .9.0.5  
  8. MaxVersion = 1 .9.1.*  

chrome.manifest

  1. content tests xpcom-test/  

test.xul

  1. <?xml version= "1.0" ?>  
  2. <?xml-stylesheet href="chrome://global/skin/"  type= "text/css" ?>  
  3. <window id="controller-example"  title= "Controller Example"   
  4.         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" >  
  5. <mce:script type="text/javascript" ><!--  
  6. function  callXPCOM() {  
  7.     try  {  
  8.         const  cid =  "@starkravingfinkle.org/specialthing;1" ;  
  9.         var  obj = Components.classes[cid].createInstance();  
  10.         obj = obj.QueryInterface(Components.interfaces.ISpecialThing);  
  11.     }  
  12.     catch (err) {  
  13.         alert(err);  
  14.         return ;  
  15.     }  
  16.     var  res = obj.add(3, 4);  
  17.     alert('3+4 = '  + res);  
  18.     var  name = obj.name;  
  19.     alert('Name = '  + name);  
  20.     obj.name = 'New Name' ;  
  21.     name = obj.name;  
  22.     alert('Name = '  + name);  
  23. }  
  24. // --></mce:script>   
  25. <button id="testXPCOM"  label= "Test XPCOM"  oncommand= "callXPCOM();" />  
  26. </window>  

如果这个文件中需要控件用中文显示,需要保存为utf-8格式

prefs.js

  1. pref("toolkit.defaultChromeURI", "chrome://tests/content/test.xul");  

这些文件都写好后,需要用命令行进入xulrunner.exe目录下,位置是xulrunner-sdk/bin

输入命令xulrunner {appname dir}/application.ini

就可以看到窗口的左上方出现一个带按钮的新窗口

阅读更多
个人分类: Firefox plugin
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭