最近做Firefox的开发,一直在用javascript写XPCOM组件,javascript这个东东来写XPCOM非常痛苦,有一点错误都无法注册成功,许多时候基本靠肉眼一个单词一个单词的找,当然也有一些技巧。Firefox开发最常用的工具有firebug和XPCOMViewer,使用XPCOMViewer来查看已注册的组件。
常见的错误:
一、死活注册不上:
注释掉其他方法和成员变量,只保留QueryInterface方法,这样基本都会注册成功了,一旦注册成功,取消掉注释,就可以使用firebug来调试了。
二、查看XPCOM Viewer(点击要找的XPCOM展开树)发现该XPCOM没有实现指定的接口或者莫名其妙的实现了没有指定的接口:
没有实现接口: 一般可能idl的接口没有实现nsISupports导致
实现了没有指定的接口:一班可能是copy别的代码,uuid重复导致
三、Cc["@company.name;1"].getService(Ci.interfaceName)或Cc["@company.name;1"].createInstance(Ci.interfaceName)出现错误,这里的Cc(Components.classes)Ci(Components.interface):
Cc["@company.name;1"] has no properties 说明中括号中组件Constract ID写错或者组件没有注册成功
Invalid InterfaceID: 说明Ci中括号中的名字写错,或者没有该接口(可以通过XPCOM Viewer查看现有的接口)
四、参数不匹配
IDL的声明参数和实际传递的参数不匹配,特别修改过参数,是注册的接口没有更新,这时候最难发现
五、已注册上组件每次在删除掉xpti.dat和compreg.dat后又注册不上,但也找不到问题所在,可以试一试在原来的代码
加减一空行,以示改变,这样可能会被注册成功。
【待续】