1

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

在 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 文件?

4

1 回答 1

2

我猜你正在关注一个过时的教程,大多数教程还没有更新到Gecko 2.0 中的 XPCOM 更改。但是对于你的问题:

我应该在 xpi 文件中的什么位置放置 .dll 文件?

任何你喜欢的地方。传统的放置在components/子目录内。

.idl 文件?

它不应该是您的扩展的一部分,而应该是.xpt文件。

.xpt 文件?

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

但是,将必要的声明添加到chrome.manifest文件中很重要,通常是这样的:

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

另请参阅有关组件代码中需要更改的内容的文档(如果您愿意,Firefox 源代码树中有一个示例)。请注意,您必须使用与您要使用该组件的 Firefox 版本相匹配的Gecko SDK版本来编译您的组件。因此,对于 Firefox 14,您需要使用 Gecko SDK 14。由于不再有任何二进制兼容性,因此您的组件将只能在 Firefox 14 中运行,而不能在 Firefox 13 或 Firefox 15 中运行。

于 2012-08-09T07:45:21.433 回答