我的Firefox扩展程序无效。使用C ++ XPCOM组件的Firefox扩展(XPI文件)的结构是什么?

时间:2012-08-08 18:43:04

标签: c++ firefox firefox-addon xpcom

我已经尝试了一百万种不同的东西,无法让它发挥作用。

在xpi文件中我有:

* content folder
     -browserOverlay.js
     -browserOverlay.xul

* locale folder
     *en-US folder
         -browserOverlay.dtd
         -browserOverlay.properties
* skin folder
         -browserOverlay.css

我有Firefox 14.0.1并且我的“Hello World”扩展程序中没有使用XPCOM的部分正在运行。它现在所做的只是添加一个带有按钮的工具栏,单击该按钮会显示“Hello World”,然后尝试运行我使用Gecko SDK构建并使用VS 2005编译的C ++ XPCOM组件。

browserOverlay.js文件包含以下代码:

/**
 * XULSchoolChrome namespace.
 */
if ("undefined" == typeof(XULSchoolChrome)) {
  var XULSchoolChrome = {};
};

/**
 * Controls the browser overlay for the Hello World extension.
 */
XULSchoolChrome.BrowserOverlay = {
  /**
   * Says 'Hello' to the user.
   */
  sayHello : function(aEvent) {
    let stringBundle = document.getElementById("xulschoolhello-string-bundle");
    let message = stringBundle.getString("xulschoolhello.greeting.label");

    window.alert(message);


    try
    {
      // normally Firefox extensions implicitly have XPCOM privileges
      //but since this is a file we have to request it.

      netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
      const cid = "@example.com/XPCOMSample/MyComponent;1";
      obj = Components.classes[cid].createInstance();
      // bind the instance we just created to our interface
      obj = obj.QueryInterface(Components.interfaces.IMyComponent);
    } catch (err) {
      alert(err);
      return;
    }
    var res = obj.Add(3, 4);
    alert('Performing 3+4. Returned ' + res + '.');
  }
};

当我点击按钮时,我会看到第一个警告窗口。单击“确定”后,我会看到一个窗口,其中包含以下错误消息:

  

TypeError:Components.classes [cid]未定义

我做错了什么?在xpi文件中我应该放置.dll文件? .idl文件? .xpt文件?

1 个答案:

答案 0 :(得分:2)

我猜您正在关注过时的教程,大多数教程尚未更新为XPCOM changes in Gecko 2.0。但是对你的问题:

  

在xpi文件中我应该放置.dll文件吗?

你喜欢的任何地方。传统的展示位置位于components/子目录中。

  

.idl文件?

它不应该是您的扩展程序的一部分,只能是.xpt文件。

  

.xpt文件?

再次在您喜欢的任何地方,但通常与.dll文件位于同一目录中。

必须向chrome.manifest文件添加必要的声明,但通常是这样的:

interfaces components/mycomponent.xpt
binary-component components/mycomponent.dll ABI=WINNT_x86-msvc

另请参阅documentation,了解组件代码中需要更改的内容(如果您愿意,可以在Firefox源代码树中添加example)。请注意,您必须使用与您要使用该组件的Firefox版本匹配的Gecko SDK版本编译组件。因此,对于Firefox 14,您需要使用Gecko SDK 14.由于不再具有任何二进制兼容性,因此您的组件将仅在Firefox 14中运行,而不在Firefox 13或Firefox 15中运行。