我一直在阅读并研究如何为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破了。)
答案 0 :(得分:4)
您的错误消息应该是由于无法正确识别XPT文件(Components.interfaces.IMyComponent
为undefined
)。也许这是因为它位于错误的目录中 - 在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,您仍然需要一个不同的解决方案。