Есть несколько мест, где вы можете хранить аддон и сообщать FireFox о его существовании.В основном все сводится к тому, как вы хотите его распространять.
В MS Windows процесс loadLibrary будет искать текущий каталог, а затем путь.Простое расположение вашего xpcom.dll рядом с 3rdparty.dll в папке компонентов вашего плагина должно работать нормально.
XPCOM похож на Windows COM, но для разных платформ.
Ваша разработка соответствует требованиям интерфейсов.
Вашему аддону, возможно, не нужно определять свой собственный интерфейс (.idl -compiles-> .xpt, .h), но если это происходит из Firefox 4, вам нужно будет указать это в chrome.manifest.
После компиляции вынужно будет также перечислить вашу DLL в chrome.manifest.
взяв примерную функцию-прототип long Add(in long a, in long b);
baz_1.idl может выглядеть так:
#include "nsISupports.idl"
[scriptable, uuid(F0F0F0F0-AAAA-BBBB-CCCC-111111111111)]
interface iBaz : nsISupports
{
long Add(in long a, in long b);
};
сгенерируйте ваш заголовок и xpi distrib
$(GECKOBIN_PATH)/xpidl -m header -I $(GECKOSDK_PATH)/idl -e baz_1.idl
$(GECKOBIN_PATH)/xpidl -m typelib -I $(GECKOSDK_PATH)/idl -e baz_1.idl
Свяжите руководство контракта с именем контракта в C ++ для использования FF4
NS_DEFINE_NAMED_CID(BAZ_CID); // defined in baz.h generated from baz_1.idl
static const mozilla::Module::ContractIDEntry kSLMozContracts[] = {
{ "@foo.bar.com/baz;1", &kBAZ_CID },
{ NULL }
};
в C ++
nsCOMPtr<iBaz> baz = do_CreateInstance("@foo.bar.com/baz;1",&rv);
использование в JavaScript
var baz = components.classes["@foo.bar.com/baz"] .createInstance(Components.interfaces.iBaz);
Пример.
У нас есть продукт, который также предоставляет аддон Firefox, поэтому мы не поставляем xpi, но аддон находится в подпапке продукта.
Продукт в
c:\program files\foo\
addon in - давайте назовем этот foobar
c:\program files\foo\bar
, зарегистрируйте аддон
HKLM\SOFTWARE\Mozilla\Firefox\Extensions\
"{GUID}"="c:\program files\foo\bar"
, тогда макет аддона будет
foobar\chrome.manifest
foobar\install.rdf
foobar\components\baz_1.xpt
foobar\components\baz_1_32.dll
foobar\components\baz_1_64.dll
foobar\components\someOtherWorker.dll
foobar\chrome\ui.jar
В FF <4 вам не нужно было перечислять двоичные файлы в манифесте, вещи в папке компонентов загружаются и проверяются на наличие функций, чтобы определить, являются ли они xpcom, поэтому манифест chrome мог выглядеть как </p>
content baz jar:chrome/ui.jar!/content/baz/
skin baz classic/1.0 jar:chrome/ui.jar!/skin/classic/baz/
Начиная с FF 4, манифесту chrome нужно перечислить ваши двоичные файлы, чтобы он выглядел следующим образом (мы поддерживаем только 64-битную версию).после FF 3.5)
content baz jar:chrome/ui.jar!/content/baz/
skin baz classic/1.0 jar:chrome/ui.jar!/skin/classic/baz/
interfaces components/baz_1.xpt
binary-component components/baz_1_32.dll ABI=WINNT_x86-msvc
binary-component components/baz_1_64.dll ABI=WINNT_x86_64-msvc appversion>=3.5
FireFox 5 (Out now) изменил
- форматы файлов xpt - так что ваши интерфейсы не будут найдены FF5, если вы не создадите с помощьюэтот SDK.
- версия регистрации xpcom - поэтому FF5 не будет использовать dll, созданную для FF4, так как версия xpcom недостаточно высока.