FireFox插件开发(三)—— scriptable实例

来源:互联网 发布:淘宝皇冠男装店铺 编辑:程序博客网 时间:2024/05/21 04:26

依然是官网的例子,下载地址是

http://mxr.mozilla.org/seamonkey/source/modules/plugin/tools/sdk/samples/scriptable/

我要使用的平台是Windows

按照网页说明编译该项目:https://developer.mozilla.org/en/Compiling_The_npruntime_Sample_Plugin_in_Visual_Studio

需要说明的是,由于这个项目引用了xpidl语言,所以不应当再使用MS的MIDL编译器,需要修改一下设置,在将sIScriptablePluginSample.idl加入到项目后,选择该文件查看该文件属性,将"常规"->"工具"的值由"MIDL工具",修改为"自定义生成工具","自定义生成步骤"->"命令行"的值设置为"$(ProjectDir)script.bat $(InputFileName)","输出"的值改为"./$(InputName).h",如果你的项目的名称不是

npscript.bat,文件名随便起,内容是

view plaincopy to clipboardprint?
  1. ../sdk/bin/xpidl.exe -m header -I../sdk/idl %1  
  2. ../sdk/bin/xpidl.exe -m typelib -I../sdk/idl %1  

还要一些共用的文件要下载到该项目下

http://mxr.mozilla.org/seamonkey/source/modules/plugin/tools/sdk/samples/include/

http://mxr.mozilla.org/seamonkey/source/modules/plugin/tools/sdk/samples/common/

然后,就可以编译该工程了


下面我们来看看如何使用这个程序调用我们之前写的xpcom-test组件

添加链接库的配置

"项目属性"->"链接器"->"输入"->"附加依赖项"的值设置为 xpcomglue_s.lib xpcom.lib nspr4.lib version.lib

"项目属性"->"链接器"->"常规"->"附加库目录"的值设置为 ../sdk/lib

idl文件中添加

view plaincopy to clipboardprint?
  1. long run(in long a, in long b);  

nsScriptablePeer.cpp中的实现

view plaincopy to clipboardprint?
  1. NS_IMETHODIMP nsScriptablePeer::Run(PRInt32 a, PRInt32 b, PRInt32 *_retval)  
  2. {  
  3.     if(mPlugin)  
  4.         *_retval = mPlugin->run( a*a, b*b );  
  5.     return NS_OK;  
  6. }  

plugin.h中加函数

view plaincopy to clipboardprint?
  1. long run(long a,long b);  

plugin.cpp中

view plaincopy to clipboardprint?
  1. long nsPluginInstance::run(long a, long b)  
  2. {  
  3.     PRInt32 lTemp = 0;  
  4.     ISpecialThing *nsspecial;  
  5.     nsCOMPtr<nsIServiceManager> serviceMgr;  
  6.     NS_GetServiceManager( getter_AddRefs(serviceMgr));  
  7.     if(serviceMgr)  
  8.     {  
  9.         serviceMgr->GetServiceByContractID( "@starkravingfinkle.org/specialthing;1", NS_GET_IID( ISpecialThing ), (void**)&nsspecial);  
  10.           
  11.         if(nsspecial)  
  12.             nsspecial->Add( a*a, b*b, &lTemp );  
  13.     }  
  14.     NS_IF_RELEASE(nsspecial);  
  15.     return lTemp;  
  16. }  

然后编译


接下来,将我们编写的plugin转成extension

步骤一、新建一个名为install.rdf的文件

<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>npscript@myplugin.com</em:id>
<em:name>npscript</em:name>
<em:version>1.0</em:version>
<em:type>2</em:type>
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>1.5</em:minVersion>
<em:maxVersion>3.0.*</em:maxVersion>

</Description>
</em:targetApplication>
</Description>
</RDF>

[说明]
1. 以邮件的格式比较好
2. 一定要有个名字标识
3. 版本信息可以自己描述,但是要满足 Toolkit version format
4. id{ec8030f7-c20a-464f-9b0e-13a3a9e97384}不可以修改,这个是FireFox的标识

步骤二、将生成的npscript.dll,nsIScriptablePluginSample.xpt放在一个Plugins的目录下,将Plugins和刚才的install.rdf文件放在目录npscript@myplugin.com(目录名要使用install.rdf中的em:id的值)下,用rar打个包,把后缀改为.xpi
目录结构是

npscript@myplugin.com

|-install.rdf
|-plugins/
||--npscript.dll
||--nsIScriptablePluginSample.xpt

|-comoponents

||--comp.xpt

||--test.dll

步骤三、把该目录npscript@myplugin.com放在Program Files/Mozilla Firefox/extensions下,重新启动FireFox

步骤四、将npscript项目下的test.html文件加个按钮和方法

view plaincopy to clipboardprint?
  1. <input type=button value="a*a+b*b" onclick='Calc()' >  
  2. function Calc()  
  3. {  
  4.     alert(embed.run(2, 3));  
  5. }  


13. 用FireFox打开该html,点按钮即可看到结果

原创粉丝点击