読み込んでいます...

前面我在XPCOM章节里面说了如何去开发一个XPCOM,XPCOM很强大,能够做很多事情,不过有时候为了代码的维护性和优化,我们有时候必须需要定义接口来制定协议。例如当我们有了多个XPCOM的时候,而又需要使用到一些相同的定义或方法,就要自己定义XPCOM的接口。这里还是强调一下,如果不太理解,还是去看如何开发JS的XPCOM

好了,首先我说,我们目的是要定义一个接口,给XPCOM去使用,所以这里我默认各位都会写XPCOM了,OK,首先,我们要写一个idl文件,如果你希望你自己的XPCOM组件能够被其他的XPCOM组件所使用,我们就需要定义接口,就需要些idl文件。在Firefox中,已经定义了很多的idl文件,也就是接口文件,如我们最常用的nsISupports就是一个idl文件,这里我们可以写一个简单的idl文件,用C/C++去写(还支持Java,Python等),代码如下。

#include "nsISupports.idl"
//这里是GUID
[scriptable, uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)]
interface nsIHelloWorld : nsISupports
{
  
string hello();
};

上面我们简单的定义了一个nsIHelloWorld接口,这个借口继承自nsISupports,在写接口的时候,我们必须定义一个GUID,并且保证这个GUID和你任何其他的XPCOM组件不同。

在写完之后,我们需要文件去编译这个idl文件,生成一个xpt文件,这个文件是加密的,其他人员是看不到的。

这些工具我们必须下载Firefox SDK的工具才能使用,所以这里我们可以说已经接触到Firefox里面比较深入的内容了。我们可以下载Gecko-sdk-win32-1.4a,这里有很多工具,同时我们还需要下载buildtools使用一些工具去编译我们的应用。

下载Gecko-sdk-win32-1.4a之后,我们可以看到很多文件夹,这里我们主要使用的是xpcom里面的bin文件夹。在编译的时候,我们还需要将buildtools里的windows\bin\x86文件下的DLL拷贝到xpcom里面的bin文件夹,去编译idl文件生成为xpt。我们需要在命令行下使用,我们使用xpidl文件去编译。命令如下。

rem 下面其中C:盘的路径是xpcom全局idl的路径
xpidl -m typelib -w -v -I "C:\Documents and Settings\jguo\Desktop\gecko-sdk\xpcom\idl" -e test.xpt test.idl

我们可以输入xpidl /?去看帮助命令,但是我还是会解释一下这个命令里的重要的参数的作用。

xpidl -m(mode) typelib(库) -w(提示错误和警告)-I(大写,idl的路径,这个路径是继承的路径,例如最前面的代码继承自nsISupports,这里就要写nsISupports的路径,而不是你编译的idl文件的路径)-e(生成的文件名),最后一个参数为需要编译的idl文件。

我们可以输入以上命令去编译在当前路径下的idl文件并生成为xpt。

前面我也说了,xpt是加密的,看不到代码的,这里我们也可以使用SDK带给我们的工具xpt_dump去看,使用xpt_dump.exe,参数为xpt文件的路径即可看到我们编译后的xpt文件中定义的结构。

既然我们在这里定义了nsIHelloWorld的接口之后,我们也可以将xpt文件放置在components文件夹下,Firefox会自己识别,然后我们在需要使用的XPCOM中使用即可,部分代码如下。

//定义接口的局部变量
const nsIHelloWorld = Components.interfaces.nsIHelloWorld;
//定义当前XPCOM对象
var SomeObject = function()
{}
//
QueryInterface: function(aIID)
{
    
//判断是否继承了这个接口
    if (!aIID.equals(nsIGuoJingTest) && !aIID.equals(nsISupports) && !aIID.equals(nsIHelloWorld))
      
throw Components.results.NS_ERROR_NO_INTERFACE;
    
return this;
}
//继承接口定义的方法

SomeObject.prototype.hello()
{
    
return "something";
}

这样以来,我们就可以定义相应的接口并自己继承和使用其他XPCOM里面的方法,接口的好处就在于制定了契约,大家都要这样去做。

不过,既然说到接口了,还是想要考考大家,interface和abstract倒底有什么区别呢:)希望大家自己好好考虑考虑。

425路过 1评论 Firefox Addon 阅读全文..
  1. 置顶的更新,文章汇总 : GuoJing's Blog | 用心对待每一行代码 @

    [...] Firefox Add-on – 更加复杂的XPCOM [...]

:-D :-? 8) :cry: 8-O :lol: :-x :-| :?: :-P :oops: :roll: :( :) :-o :wink: more »