Объектный метод XPCOM недоступен из JavaScript - PullRequest
1 голос
/ 31 января 2012

Я пытаюсь создать расширение для Firefox.Это расширение использует компонент XPCOM (DLL C ++).Я компилирую DLL, с компиляцией все в порядке.

Мне также удалось создать код JS, который создает экземпляр объекта из XPCOM:

try {
   greenfox;
   return true;
} catch( e ) {
   alert( e );
   return false;
}

Возвращенный объект:

QueryInterface
    QueryInterface()

__proto__
    [xpconnect wrapped native prototype] { QueryInterface=QueryInterface()}

QueryInterface
    QueryInterface()

Все хорошо, за исключением того, что я не могу вызвать функцию, которая должна быть в моем компоненте XPCOM.

Вот мой файл IDL:

[scriptable, uuid(ec8030f7-c20a-464f-9b0e-13a3a9e97384)]
interface nsISample : nsISupports
{
    attribute string value;
    void writeValue(in string aPrefix);
    void poke(in string aValue);

    void start();
    double stop();
};

При вызове функции () я получаю ошибку Javascript: «это не функция»

greenfox.start();

У вас есть идеи?Похоже, что в моем XPCOM нет функций.

Ответы [ 2 ]

1 голос
/ 31 января 2012

Вы, похоже, смотрите на объект, представляющий только интерфейс nsISupports. Ваш интерфейс (nsISample) не будет отображаться по умолчанию, вы должны явно запросить его. Вы можете сделать это, например, создав экземпляр вашего компонента следующим образом:

var greenfox = Components.classes["..."].getService(Components.interfaces.nsISample);
greenfox.start();

Кроме того, вы также можете вызвать QueryInterface для объекта, который у вас уже есть:

greenfox.QueryInterface(Components.interfaces.nsISample);
greenfox.start();

Как правило, я бы не рекомендовал использовать двоичный компонент XPCOM по причинам, изложенным здесь , для их обслуживания требуется слишком много усилий. Я бы скорее предложил скомпилировать обычную DLL и использовать ее через js-ctypes . Ссылка бинарного компонента на js-ctypes упоминает, как найти библиотеку DLL внутри вашего дополнения, чтобы использовать ее через js-ctypes.

0 голосов
/ 31 января 2012

Вы вызываете QueryInterface со своим uuid? Это необходимо вызвать перед использованием созданного экземпляра компонента. Ваше использование соответствует тому, что в здесь ?

Если вы не хотите иметь дело с XPCOM, вы можете использовать js-ctypes .

...