【问题标题】:Firefox Extension/Addon Binary Component Backward CompatibilityFirefox 扩展/插件二进制组件向后兼容性
【发布时间】:2011-06-26 19:30:52
【问题描述】:

我一直在阅读并研究为 Firefox 扩展编译二进制组件的方法。由于 Firefox 5 即将发布(6 和 7 即将推出),我想知道二进制组件是否值得再制作,或者只是使用独立的可执行文件来运行我想要的功能。

我有一个示例二进制组件要为 Firefox 5 编译,但是当我在 Firefox 3.6 上测试它时,我得到了这个错误:

[Exception... "Could not convert Native argument arg 0 [nsISupports.QueryInterface]" nsresult: "0x8057000a (NS_ERROR_XPC_BAD_CONVERT_NATIVE)"

运行这段代码

var obj = Components.classes['@example.com/MyComponent;1'].QueryInterface(Components.interfaces.IMyComponent);

以及 QueryInterface 的错误。显然是为 Firefox 4 构建的(XULrunner-sdk 2.0 而不是 5.0 可以工作)。

这是模块代码:

#include "mozilla/ModuleUtils.h"
#include "MyComponent.h"

NS_GENERIC_FACTORY_CONSTRUCTOR(MyComponent)

NS_DEFINE_NAMED_CID(MY_COMPONENT_CID);

static const mozilla::Module::CIDEntry kMyComponentCIDs[] = {
    { &kMY_COMPONENT_CID, false, NULL, MyComponentConstructor },
    { NULL }
};

static const mozilla::Module::ContractIDEntry kMyComponentContracts[] = {
    { MY_COMPONENT_CONTRACTID, &kMY_COMPONENT_CID },
    { NULL }
};

static const mozilla::Module kMyComponentModule = {
    mozilla::Module::kVersion,
    kMyComponentCIDs,
    kMyComponentContracts,
    NULL
};

NSMODULE_DEFN(NS_MyComponent_Module) = &kMyComponentModule;
NS_IMPL_MOZILLA192_NSGETMODULE(&kMyComponentModule)

我还听说FF3.6 不需要在manifest 文件中包含xpt 或dll。

所以基本上我的问题是,为了向后兼容,制作可执行文件还是继续制作二进制组件更好? (因为看起来像是为 FF5 编译的,所以 FF3.6 坏了。)

【问题讨论】:

    标签: c++ firefox firefox-addon components backwards-compatibility


    【解决方案1】:

    您的错误消息应该是由于无法正确识别 XPT 文件(Components.interfaces.IMyComponentundefined)。可能是因为它位于错误的目录中 - 在 Firefox 3.6 中,您没有在 chrome.manifest 文件中声明它,而是它必须与您的 dll 文件一起位于 compoments/ 目录中。

    XPCOM 组件的向后兼容性故事从 Firefox 4 开始变得更糟,请参阅https://developer.mozilla.org/En/Developer_Guide/Interface_Compatibility#Binary_Interfaces。从理论上讲,如果您想支持多个 Firefox 版本,您需要将多个版本的 XPCOM 组件放入您的 XPI 包中,对于每六周发布一次的版本来说,这需要付出很多努力。如果真正要从本机库中调用一些函数,那么您应该认真考虑切换到js-ctypes。你也可以随你的扩展发布一个原生库(plain,而不是 XPCOM),并使用 js-ctypes 来调用它。 Firefox 从版本 4 (Gecko 2.0) 开始支持 js-ctypes,对于 Firefox 3.6,您仍然需要不同的解决方案。

    【讨论】:

    • 谢谢,我会研究一下 js-ctypes。你知道使用这种方法而不是二进制组件是否会影响性能时间?是时候学习dll编译了,感谢大家的帮助!
    • @user654628:不,我不知道——但如果只是几个电话,那不值得考虑。一般来说,XPCOM 调用有很大的开销,尤其是从 JavaScript 调用时。所以我什至不确定 js-ctypes 是否更慢。
    • @WladimirPalant 我在这里发布了一个这样的问题:ask.mozilla.org/question/1318/… 你可以在那里回复(或者我可以在这里重新发布)关于当你'时如何访问客户共享库 .dll重新尝试将其打包到使用插件 sdk 构建的插件中?换句话说,我使用的是javascript ctypes,但我仍然需要打包我的dll并以某种方式将其加载到插件中
    • @Derek:不幸的是,这不是一个微不足道的问题。附加 SDK 不支持解压缩的扩展,但 DLL 不能从 ZIP 存档中工作。因此,您的扩展可能必须将 DLL 放入其data 目录,然后通过二进制 XMLHttpRequest 下载它并将其写入某个临时目录。然后你就可以通过 js-ctypes 使用它了。弄清楚它的细节需要相当多的时间,我现在没有时间。
    • @Derek:不,您可以相当轻松地创建自己的restartless extension(比经典扩展更干净,但遗憾的是大多数文档仍然适用于这些)。但是,您必须额外确保关闭库,否则它将在 Windows 下锁定更新并导致问题。
    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多