Can';t为Firefox扩展创建javascript XPCOM服务

Can';t为Firefox扩展创建javascript XPCOM服务,javascript,firefox-addon,xpcom,Javascript,Firefox Addon,Xpcom,两天多来,我一直在用头撞这堵砖墙。我正在尝试创建一个XPCOM服务,以便在Firefox扩展中使用,但由于Firefox的错误控制台中显示以下错误,因此无法初始化该组件 Timestamp: 07/06/2012 09:23:28 Error: uncaught exception: [Exception... "Component returned failure code: 0x80570016 (NS_ERROR_XPC_GS_RETURNED_FAILURE) [nsIJSCID.ge

两天多来,我一直在用头撞这堵砖墙。我正在尝试创建一个XPCOM服务,以便在Firefox扩展中使用,但由于Firefox的错误控制台中显示以下错误,因此无法初始化该组件

Timestamp: 07/06/2012 09:23:28 Error: uncaught exception: [Exception... 
"Component returned failure code: 0x80570016 (NS_ERROR_XPC_GS_RETURNED_FAILURE)
[nsIJSCID.getService]"  nsresult: "0x80570016 (NS_ERROR_XPC_GS_RETURNED_FAILURE)"
location: "JS frame :: chrome://logger/content/logger.js :: <TOP_LEVEL> :: line 21"
data: no]
创建模块和工厂接口的样板文件的其余部分保持不变

chrome.manifest文件如下所示

content   logger                 chrome/content/
skin      logger   classic/1.0   chrome/skin/
locale    logger   en-US         chrome/locale/en-US/

component {808e1607-caea-418c-b563-d9fe1df6ee08} components/loggerservice.js
contract @test/loggerservice;1 {808e1607-caea-418c-b563-d9fe1df6ee08}

overlay chrome://browser/content/browser.xul chrome://logger/content/logger-overlay.xul
style   chrome://global/content/customizeToolbar.xul chrome://logger/skin/overlay.css
最后,
logger overlay.xul
文件包含一个脚本文件-
logger.js
,它试图使用以下代码获取对
LoggerService
组件的引用

this.loggerService = Components.classes["@test/logger;1"].getService().wrappedJSObject;
firefox错误控制台中报告的就是这一行


我看不出我能让它变得多么简单-任何洞察都将不胜感激。

这是一个很好的样板文件生成器,但不幸的是,它已经过时了。首先,您应该使用,这将消除大多数样板文件。更重要的是,此boilerplace生成器尚未更新为并定义
NSGetModule
函数,而不是
NSGetFactory
。但是,这样的模块代码应该可以工作:

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");

function LoggerService() {
  this.wrappedJSObject = this;
}

LoggerService.prototype = {
  classID: Components.ID("808e1607-caea-418c-b563-d9fe1df6ee08"),
  classDescription: "Test component",
  contractID: "@test/loggerservice;1",

  QueryInterface: XPCOMUtils.generateQI([])
}

if ("generateNSGetFactory" in XPCOMUtils)
  var NSGetFactory = XPCOMUtils.generateNSGetFactory([LoggerService]);  // 2.0+
else
  var NSGetModule = XPCOMUtils.generateNSGetModule([LoggerService]);    // 1.9.x
如果您的扩展不需要与Firefox 3.6兼容,您可以删除
NSGetModule
代码。您还可以删除
classDescription
constract
属性,这些属性已经在
chrome.manifest
中指定


注意:如果您只需要一个在整个浏览会话中都可以访问的对象,那么a将是一个更好的选择-没有XPCOM样板文件,也没有
wrappedJSObject
hacks。

Wladimir-谢谢-顶级建议!由于使用了XPCOMUtils,代码现在变得更干净了。现在我终于可以继续发展我的服务了!
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");

function LoggerService() {
  this.wrappedJSObject = this;
}

LoggerService.prototype = {
  classID: Components.ID("808e1607-caea-418c-b563-d9fe1df6ee08"),
  classDescription: "Test component",
  contractID: "@test/loggerservice;1",

  QueryInterface: XPCOMUtils.generateQI([])
}

if ("generateNSGetFactory" in XPCOMUtils)
  var NSGetFactory = XPCOMUtils.generateNSGetFactory([LoggerService]);  // 2.0+
else
  var NSGetModule = XPCOMUtils.generateNSGetModule([LoggerService]);    // 1.9.x