编写第一个javascript的XPCOM,以及一些小问题的解决。

如果会阅读E文文档,那么阅读一下 这个这个这个是很有帮助的。
在上一篇 日志的基础上,加一个XPCOM应该不是很难的事情。

在firefox3.0之后,引入了方便javascript XPCOM编写的XPCOMUtils,在MDC的
教程上有两个版本的示例代码。本着一切从简的原则,区区把不用XPCOMUtils的
版本照抄了一个。。

编写HelloWorld.idl:
#include  " nsISupports.idl "

[scriptable, uuid(
53E1581F - FFFF - 4b0f - 8FF0 - 02FC75F3698D)]
interface  nsIHelloWorld : nsISupports
{
  
string hello();
}
;  


再来就是运行命令行编译:
{sdk_dir}/bin/xpidl -m typelib -w -v -I {sdk_dir}/idl -e HelloWorld.xpt HelloWorld.idl
在此区区强烈建议把.idl文件.xpt文件和.js目前都放在myapp/components目录下,这样可以省却很多麻烦。

好,区区编写HelloWorld.js实现这个XPCOM:
首个版本代码参见 http://developer.mozilla.org/en/docs/How_to_Build_an_XPCOM_Component_in_Javascript
基本上只是contract_id不同。
剧情预告就是,区区这样编写的.js无法启用,xulrunner和firefox3.0(是D,火狐也可当xulrunner用)通通报错说找不到class。


然后在把main.xul的windows tag的内容改成:
   < vbox  align ="center" >
  
< caption  label ="Hello World" />
  
< caption  label ="Javascript World" />
  
< button  label ="XPCOM"  onmousedown ="onXPCOMClick(event)" />
  
</ vbox >

接着就是在main.js中加入函数:
function  onXPCOMClick(event)  {
    
try {
        alert(Components.interfaces.nsIHelloWorld);
        
var myComponent = Components.classes['@joyer.huang/helloworld;1']
            .createInstance(Components.interfaces.nsIHelloWorld);
        
        alert(myComponent.hello());
        alert(myComponent.wrappedJSObject.pi());
    }
 catch (anError) {
        alert(
"ERROR: " + anError);
    }

}

反复试了多遍之后,我总结觉得不用XPCOMUtils实现的代码太长(许多时候错误都与代码长度成正比),加入
翻看了几个其它官方的xpcom都用XPCOMUtils了,所以痛下决心写了第二个HelloWorld.js:
const Cc  =  Components.classes;
const Ci 
=  Components.interfaces;
const Cr 
=  Components.results;

Components.utils.import(
" resource://gre/modules/XPCOMUtils.jsm " );
function  HelloWorld()  {
    
this.wrappedJSObject = this;
}
;

HelloWorld.prototype 
=   {
    hello: 
function() {
        
return "Joyer, Hello World!";
    }
,
    pi: 
function() {
        
return 3.141592654;
    }
,
    classDescription: 
"Joyer Hello World Javascript XPCOM Component",
    contractID: 
"@joyer.huang/helloworld;1",
    classID: Components.ID(
"{53E1581F-FFFF-4b0f-8FF0-02FC75F3698D}"),  
    QueryInterface:XPCOMUtils.generateQI([Ci.nsIHelloWorld]),
  
}
;

function  NSGetModule(aCompMgr, aFileSpec)  return XPCOMUtils.generateModule([HelloWorld]); }

代码目前都正确了,但是要让main.xul运行起来有期望的行为,还得注意下面几个事情:
1.要变更一下application的BuildID,不然XPCOM不会重注册
2.要认真查看代码中的语法错误,或者拼写错误。(区区花了半小时才发现自己错把最后一下HelloWorld写成Helloworld)
3.如果还是运行不起来,在尝试各种xulrunner的调试和跟踪方法。如以-console来启动xulrunner

注意:在这个XPCOM实现中,区区试用了wrappedJSObject技巧,这个技巧好处是不用重新编译IDL和typelib就可以让XPCOM拥有新的接口,这对于js这样的动态语言来说再自然不过,而且在开发测试时很有用~

一番折腾后,深切体会到mozilla平台在调试、文档、版本管理方面与emacs的差距啊。。。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值