Я читал и искал способы компилировать двоичные компоненты для расширений 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 сломался.)