Firefox扩展/插件二进制组件向后兼容性

时间:2011-06-26 19:30:52

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

我一直在阅读并研究如何为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不需要在清单文件中包含xpt或dll。

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

1 个答案:

答案 0 :(得分:4)

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

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