<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://lorwiki.zhbert.ru/index.php?action=history&amp;feed=atom&amp;title=XUL%2FXPCOM</id>
	<title>XUL/XPCOM - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://lorwiki.zhbert.ru/index.php?action=history&amp;feed=atom&amp;title=XUL%2FXPCOM"/>
	<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=XUL/XPCOM&amp;action=history"/>
	<updated>2026-10-12T23:41:53Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.39.0</generator>
	<entry>
		<id>http://lorwiki.zhbert.ru/index.php?title=XUL/XPCOM&amp;diff=231&amp;oldid=prev</id>
		<title>Admin: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=XUL/XPCOM&amp;diff=231&amp;oldid=prev"/>
		<updated>2023-02-27T18:39:16Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 21:39, 27 февраля 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://lorwiki.zhbert.ru/index.php?title=XUL/XPCOM&amp;diff=230&amp;oldid=prev</id>
		<title>lor&gt;Cetjs2: файл потерялся, эх</title>
		<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=XUL/XPCOM&amp;diff=230&amp;oldid=prev"/>
		<updated>2018-10-25T13:06:17Z</updated>

		<summary type="html">&lt;p&gt;файл потерялся, эх&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Что такое XPCOM==&lt;br /&gt;
'''XPCOM''' - Кроссплатформенная Компонентная Объектная Модель (Cross Platform Component Object Model). Данная модель схожа с небезызвестным COM в ОС Windows, и предоставляет собой механизм создания и динамической загрузки компонентов в Вашу программу. Компонент обычно представляет собой некий класс, объект которого можно создать и использовать в программе. Компоненты XPCOM могут быть использованы из языков C, C++, JavaScript. В отличие от прямой линковки в библиотекой, как например это обычно делается в языке C++ (g++ -o program -lsomelib), механизм XPCOM полностью динамический, и позволяет подгружать новые типы во время выполнения программы. XPCOM компоненты могут быть написаны как на C++, так и на JavaScript. Большинство интерфейсов, используемых в JavaScript в XUL есть ни что иное, как XPCOM компоненты.&lt;br /&gt;
&lt;br /&gt;
При написании XPCOM компонентов нужно знать четыре понятия:&lt;br /&gt;
&lt;br /&gt;
* '''интерфейс''' - набор методов и атрибутов, которые как-то логически связаны друг с другом;&lt;br /&gt;
* '''компонент''' - это объект, реализующий один или больше интерфейсов;&lt;br /&gt;
* '''фабрика''' - объект (или функция), создающий компоненты, реализует интерфейс [http://developer.mozilla.org/en/docs/nsIFactory nsIFactory];&lt;br /&gt;
* '''модуль''' - объект, управлящий набором фабрик, реализует интерфейс [http://developer.mozilla.org/en/docs/nsIModule nsIModule].&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что эти понятия связаны не только с XPCOM, а с компонентным программированием вообще. Эти же понятия вы можете встретить, например, при работе с ''D-Bus''. В ''D-Bus'' роль модуля выполняет программа, создающая корневой dbus сервис (по аналогии с фабрикой), роль компонентов выполняют дочерние dbus объекты, которые аналогично с XPCOM могут реализовывать несколько интерфейсов.&lt;br /&gt;
==Подготовка==&lt;br /&gt;
Для компиляции XPCOM компонента необходим компилятор, набор стандартных заголовочных файлов, набор для разработки (SDK) для XUL. Для дистрибутивов, основанных на Debian, необходимо установить пакеты build-essential, xulrunner-1.9-dev. Xulrunner-1.9 у Вас уже должен стоять. &lt;br /&gt;
&lt;br /&gt;
В Makefile в исходниках примера установите переменную GECKO_SDK_PATH равной пути к заголовкам и IDL файлоам xulrunner. В KUbuntu Gutsy это /usr/lib/xulrunner-devel-1.9a8. Посмотрите путь, куда установились файлы из пакета xulrunner-1.9-dev (dpkg -L xulrunner-1.9-dev), там должны быть каталоги include, idl, bin, lib - этот путь и должен быть в GECKO_SDK_PATH. Для работы из командной строки, можно также сделать&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# export XUL=/usr/lib/xulrunner-devel-1.9a8&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь мы сможем быстро вызвать какую-нибудь утилиту из комплекта разработчика XUL, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# $XUL/bin/xpidl&lt;br /&gt;
&lt;br /&gt;
ERROR: must specify output mode&lt;br /&gt;
Usage: /usr/lib/xulrunner-devel-1.9a8/bin/xpidl -m mode [-w] [-v] [-t version number] [-d filename.pp]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном примере мы рассмотрим простейший компонент, который складывает два числа и возвращает результат.&lt;br /&gt;
&lt;br /&gt;
==Создаём GUID==&lt;br /&gt;
Для компонента и интерфейса необходимо создать уникальный идентификатор, GUID. Используем утилиту '''uuidgen''' из пакета '''e2fsprogs'''.&lt;br /&gt;
&lt;br /&gt;
==Создаём файл с описанием нашего компонента (IDL)==&lt;br /&gt;
&lt;br /&gt;
В XPCOM для описания компонентов используется формат файла, называемый [http://www.mozilla.org/scriptable/xpidl/idl-authors-guide XPIDL], схожий с IDL из CORBA. В этом файле описывается имя интерфейса, его методы, атрибуты, уникальный идентификатор, наследование и другое. В нашем случае:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#include &amp;quot;nsISupports.idl&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[scriptable, uuid(_YOUR_INTERFACE_GUID_)]&lt;br /&gt;
interface IMyComponent : nsISupports&lt;br /&gt;
{&lt;br /&gt;
  // Только один метод, для сложения чисел&lt;br /&gt;
  long Add(in long a, in long b);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы описали интерфейс с именем '''IMyComponent''', имеющий всего лишь один метод для сложения чисел. Вместо '''_YOUR_INTERFACE_GUID_''' вставляем сгенерированный ранее GUID. Наш интерфейс должен наследоваться от базового интерфейса [http://developer.mozilla.org/en/nsISupports nsISupports], который имеет общую функциональность для всех интерфейсов - методы '''AddRef''', '''QueryInterface''' и '''Release''' (аналогично интерфейсу '''IUnknown''' в COM). Метод '''AddRef''' увеличивает внутренний счётчик на 1 при дублировании указателя на интерфейс. '''Release''' служит для уменьшения внутреннего счётчика на 1, когда один из дублированных указателей больше не нужен. Если счётчик равен 0, то '''Release''' безжалостно удаляет самого себя (объект this). '''QueryInterface''' служит для получения указателя на один из поддерживаемых интерфейсов (с увеличением счётчика, если интерфейс найден), полагаясь на переданный в качестве аргумента идентификтор.&lt;br /&gt;
&lt;br /&gt;
Ключевое слово '''scriptable''' указывает на то, что мы можем использовать этот интерфейс из скриптового языка, например JavaScript. Без указания этого ключевого слова мы не сможет использовать наш компонент из JavaScript.&lt;br /&gt;
&lt;br /&gt;
Сохраняем этот файл как ''IMyComponent.idl''.&lt;br /&gt;
&lt;br /&gt;
== Генерация заголовка и xpt библиотеки==&lt;br /&gt;
Теперь нам необходимо из описания нашего интрефейса, XPIDL файла, сгенерировать заголовочный файл, который мы будем использовать далее при реализации методов, и .xpt библиотеку. XPT библиотека - это бинарное представления файла описания XPIDL, она аналогично содержит имя интерфейса, его методы, атрибуты, уникальный идентификатор и т.д., только в бинарном виде, что облегчает жизнь загрузчику компонента (XPConnect).&lt;br /&gt;
&lt;br /&gt;
Следующие строки не являются обязательными, т.к. они уже внесены в Makefile из примера, но всё-таки не помешает знать, как это делается.&lt;br /&gt;
&lt;br /&gt;
Итак, генерируем заголовочный файл:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# $XUL/bin/xpidl -m header -I$XUL/idl IMyComponent.idl&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создаётся файл ''IMyComponent.h''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# $XUL/bin/xpidl -m typelib -I$XUL/idl IMyComponent.idl&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создаётся файл ''IMyComponent.xpt''.&lt;br /&gt;
&lt;br /&gt;
==Создаём реализацию компонента==&lt;br /&gt;
Создаём файл ''MyComponent.h'' - здесь будет объявление (definition) класса нашего компонента:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef _MY_COMPONENT_H_&lt;br /&gt;
#define _MY_COMPONENT_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;IMyComponent.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Строка-идентификатор нашего компонента, т.н. Contract ID. Используя это строку мы сможем загрузить компонент.&lt;br /&gt;
// Обычно эта строка имеет какой-то осмысленный вид, куда вносится домен, имя компонента, версия.&lt;br /&gt;
#define MY_COMPONENT_CONTRACTID &amp;quot;@mydomain.com/XPCOMSample/MyComponent;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Имя класса&lt;br /&gt;
#define MY_COMPONENT_CLASSNAME  &amp;quot;A Simple XPCOM Sample&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Уникальный 128-битный идентификатор компонента, аналогичный идентификатору интерфейса, только&lt;br /&gt;
// в бинарном виде.&lt;br /&gt;
#define MY_COMPONENT_CID        { 0x597a60b0, 0x5272, 0x4284, { 0x90, 0xf6, 0xe9, 0x6c, 0x24, 0x2d, 0x74, 0x6 } }&lt;br /&gt;
&lt;br /&gt;
// Объявляем класс компонента, наследуемся от сгенерированного класса IMyComponent.&lt;br /&gt;
class MyComponent : public IMyComponent&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&lt;br /&gt;
  // Этот макрос вставляет объявление стандартных трёх public методов из nsISupports,&lt;br /&gt;
  // и protected атрибута-счётика ссылок.&lt;br /&gt;
  NS_DECL_ISUPPORTS&lt;br /&gt;
&lt;br /&gt;
  // Этот макрос вставляет объявление нашего метода Add().&lt;br /&gt;
  NS_DECL_IMYCOMPONENT&lt;br /&gt;
&lt;br /&gt;
  MyComponent();&lt;br /&gt;
  virtual ~MyComponent();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif //_MY_COMPONENT_H_&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создаём файл ''MyComponent.cpp'' - здесь будет реализация класса нашего компонента:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#include &amp;quot;MyComponent.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Этот макрос вставляет стандартную реализацию методов AddRef(), Release() и QueryInterface().&lt;br /&gt;
// Параметры - класс и интерфейс.&lt;br /&gt;
NS_IMPL_ISUPPORTS1(MyComponent, IMyComponent)&lt;br /&gt;
&lt;br /&gt;
MyComponent::MyComponent()&lt;br /&gt;
{}&lt;br /&gt;
&lt;br /&gt;
MyComponent::~MyComponent()&lt;br /&gt;
{}&lt;br /&gt;
&lt;br /&gt;
// Реализация метода Add()&lt;br /&gt;
NS_IMETHODIMP MyComponent::Add(PRInt32 a, PRInt32 b, PRInt32 *_retval)&lt;br /&gt;
{&lt;br /&gt;
        *_retval = a + b;&lt;br /&gt;
        return NS_OK;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создаём код для загрузчика==&lt;br /&gt;
Создаём файл ''MyComponentModule.cpp'', где будет находится информация для загрузчика нашего компонента:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#include &amp;quot;nsIGenericFactory.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MyComponent.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Создаём конструктор (фабрику) нашего компонента. Этот макрос&lt;br /&gt;
// создаёт static функцию с именем &amp;lt;имя_аргумента&amp;gt;Constructor, в нашем случае&lt;br /&gt;
// MyComponentConstructor, которая далее используется в структуре components.&lt;br /&gt;
NS_GENERIC_FACTORY_CONSTRUCTOR(MyComponent)&lt;br /&gt;
&lt;br /&gt;
// Структура с описанием нашего компонента&lt;br /&gt;
static nsModuleComponentInfo components[] =&lt;br /&gt;
{&lt;br /&gt;
    {&lt;br /&gt;
       MY_COMPONENT_CLASSNAME,&lt;br /&gt;
       MY_COMPONENT_CID,&lt;br /&gt;
       MY_COMPONENT_CONTRACTID,&lt;br /&gt;
       MyComponentConstructor,&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Создаём точку входа с необходимой информацией. Это аналогично extern &amp;quot;C&amp;quot; функциям&lt;br /&gt;
// в С++ библиотеках, загружаемых через dlopen(), и которые создают и возвращают указатель&lt;br /&gt;
// на объект класса.&lt;br /&gt;
NS_IMPL_NSGETMODULE(&amp;quot;MyComponentsModule&amp;quot;, components)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Весь необходимый исходный код написан, теперь создадим файл сборки - ''Makefile''.&lt;br /&gt;
&lt;br /&gt;
== Makefile==&lt;br /&gt;
&lt;br /&gt;
Создаём файл ''Makefile'', не забываем поправить переменную '''GECKO_SDK_PATH'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
CXX = g++&lt;br /&gt;
CPPFLAGS += -fno-rtti -fno-exceptions -shared&lt;br /&gt;
&lt;br /&gt;
GECKO_SDK_PATH = /usr/lib/xulrunner-devel-1.9a8&lt;br /&gt;
&lt;br /&gt;
GECKO_CONFIG_INCLUDE = -include mozilla-config.h&lt;br /&gt;
&lt;br /&gt;
GECKO_DEFINES  = -DXPCOM_GLUE -DXPCOM_GLUE_USE_NSPR&lt;br /&gt;
&lt;br /&gt;
GECKO_INCLUDES = -I$(GECKO_SDK_PATH)/include -I$(GECKO_SDK_PATH)/sdk/include&lt;br /&gt;
&lt;br /&gt;
GECKO_LDFLAGS =  -L$(GECKO_SDK_PATH)/lib -lxpcomglue_s -lxul -lxpcom -lplds4 -lplc4 -lnspr4 -lpthread -ldl&lt;br /&gt;
&lt;br /&gt;
FILES = MyComponent.cpp MyComponentModule.cpp&lt;br /&gt;
&lt;br /&gt;
TARGET = MyComponent.so&lt;br /&gt;
&lt;br /&gt;
build:&lt;br /&gt;
        $(GECKO_SDK_PATH)/bin/xpidl -m header  -I$(GECKO_SDK_PATH)/idl IMyComponent.idl&lt;br /&gt;
        $(GECKO_SDK_PATH)/bin/xpidl -m typelib -I$(GECKO_SDK_PATH)/idl IMyComponent.idl&lt;br /&gt;
        $(CXX) -Wall -O2 -o $(TARGET) $(GECKO_CONFIG_INCLUDE) $(GECKO_DEFINES) $(GECKO_INCLUDES) $(CPPFLAGS) $(CXXFLAGS) $(FILES) $(GECKO_LDFLAGS)&lt;br /&gt;
        chmod +x $(TARGET)&lt;br /&gt;
        strip $(TARGET)&lt;br /&gt;
&lt;br /&gt;
clean:&lt;br /&gt;
        rm -f IMyComponent.xpt&lt;br /&gt;
        rm -f IMyComponent.h&lt;br /&gt;
        rm -f $(TARGET)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Сборка и запуск==&lt;br /&gt;
Мы создали всё необходимое для сборки XPCOM компонента. Теперь просто используем утилиту ''make'' для сборки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# make&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если всё прошло удачно, создастся динамическая библиотека ''MyComponent.so''. Эту библиотеку и .xpt файл копируем в каталог '''components''' нашего XUL проекта, и в проекте создаём .xul файл наподобие:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;?xml-stylesheet href=&amp;quot;chrome://global/skin/&amp;quot; type=&amp;quot;text/css&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;window&lt;br /&gt;
    title=&amp;quot;Example&amp;quot;&lt;br /&gt;
    width=&amp;quot;320&amp;quot;&lt;br /&gt;
    height=&amp;quot;200&amp;quot;&lt;br /&gt;
    xmlns=&amp;quot;http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;label id=&amp;quot;result&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;application/x-javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function MyComponentTest()&lt;br /&gt;
{&lt;br /&gt;
    var obj = null;&lt;br /&gt;
&lt;br /&gt;
    try&lt;br /&gt;
    {&lt;br /&gt;
        // По Contract ID получаем доступ к модулю&lt;br /&gt;
        const cid = &amp;quot;@mydomain.com/XPCOMSample/MyComponent;1&amp;quot;;&lt;br /&gt;
        obj = Components.classes[cid].createInstance();&lt;br /&gt;
&lt;br /&gt;
        // Получаем указатель на объект нашего интерфейса&lt;br /&gt;
        obj = obj.QueryInterface(Components.interfaces.IMyComponent);&lt;br /&gt;
    }&lt;br /&gt;
    catch(err)&lt;br /&gt;
    {&lt;br /&gt;
        alert(err);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Вызываем наш метод для сложения чисел&lt;br /&gt;
    var res = obj.Add(3, 4);&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;result&amp;quot;).value = &amp;quot;3 + 4 = &amp;quot; + res;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
MyComponentTest();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/window&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запускаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# xulrunner ./application.ini&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вы должны увидеть окно с текстом '''3 + 4 = 7''' внутри.&lt;br /&gt;
&lt;br /&gt;
Исходники XUL проекта и XPCOM компонента приведены ниже.&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
* [http://www.iosart.com/firefox/xpcom/ Оригинал статьи на английском]&lt;br /&gt;
* [http://www.mozilla.org/scriptable/ Информация по XPConnect от Mozilla]&lt;br /&gt;
* [http://www.mozilla.org/projects/xpcom/index.html Информация по XPCOM от Mozilla]&lt;br /&gt;
* [http://www.mozilla.org/projects/xpcom/book/cxc/html/index.html Информация по XPCOM]&lt;br /&gt;
* [http://lxr.mozilla.org/seamonkey/source/xpcom/sample/ Ещё пример по XPCOM]&lt;br /&gt;
* [http://www.mozilla.org/scriptable/xpidl/idl-authors-guide/ Информация по XPIDL от Mozilla]&lt;br /&gt;
&lt;br /&gt;
''Это статья основана на примере по XPCOM от Alex Sirota. Редакция для запуска под xulrunner-1.9, текст разделов и комментарии в С++ и JavaScript коде на этой странице от пользователя Alex Custov.''&lt;br /&gt;
&lt;br /&gt;
[[Category:XUL]]&lt;/div&gt;</summary>
		<author><name>lor&gt;Cetjs2</name></author>
	</entry>
</feed>