Интернет, компьютеры, софт и прочий Hi-Tech

Подписаться через RSS2Email.ru

Доступ к реестру Windows с помощью XPCOM

Введение

При реализации Windows-специфической функциональности, часто требуется доступ к реестру Windows для получения информации о других установленных в окружении программ. Для этого в XPCOM существуют интерфейсы для чтения и записи данных реестра. Данная статья предназначена показать, как используются эти интерфейсы в некоторых продуктах Mozilla. Все примеры из этого документа написаны на JavaScript с использованием XPCOM.

Поддержка в Firefox 1.5 и более новых версиях

В Firefox 1.5 было добавлено новое API, представленное интерфейсом nsIWindowsRegKey, который предоставляет расширенную функциональность для работы с реестром. Этот интерфейс реализует все необходимое API и за вас беспокоится о реализации некоторых низкоуровневых нюансах Windows. Если расширение, которое вы пишите, предназначено работать только с Firefox 1.5 и более поздними версиями, то этого раздела вам будет вполне достаточно для работы.

Простой пример

Вот простой пример, демонстрирующий, как прочесть ProductId вашей Windows:

var wrk = Components.classes["@mozilla.org/windows-registry-key;1"]
                    .createInstance(Components.interfaces.nsIWindowsRegKey);
wrk.open(wrk.ROOT_KEY_LOCAL_MACHINE,
         "SOFTWARE\\Microsoft\\Windows\\CurrentVersion",
         wrk.ACCESS_READ);
var id = wrk.readStringValue("ProductId");
wrk.close();

Несмотря на свою простоту этот пример демонстрирует несколько важных моментов, касающихся использования интерфейса. Во-первых, вы должны использовать createInstance() для получения экземпляра объекта этого интерфейса, а не getService(). Во-вторых, вы должны вызвать open() с нужным ключом перед попыткой чтения его значения.

Заметьте, что при вызове open() указан корневой ключ с использованием именованной константы, определяемой интерфейсом nsIWindowsRegKey. А именно — ROOT_KEY_LOCAL_MACHINE, которая соответствует HKEY_LOCAL_MACHINE в реестре Windows. Также заметьте, что путь к ключу содержит эскейпирование обратных слэшей, обязательное в строковых константах JavaScript и C++.

Требуемые права доступа указываются с помощью именованной константы из интерфейса. В данном примере это — ACCESS_READ. Это может оказаться очень важным, когда действие осуществляется из под не-администраторского аккаунта с ограниченными привилегиями.

Соответствующие ключам значения читаются с помощью readStringValue(). При чтении вы можете указать, какого типа данные вы ожидаете получить. Это будет подробнее описано ниже. Кроме того, заметьте, что вы должны закрыть ключ после использования, если не желаете вызвать утечку системных ресурсов.

Открытие ключей реестра

Перед тем, как что либо делать с ключом реестра, вы должны сначала открыть этот интересующий вас ключ. На примере выше показано, как использовать для этого метод open(). Если вы хотите создать новый ключ, вы можете использовать метод create(), который имеет те же праметры, что и open(). Заметьте, что вызов create() для существующего ключа не приведет к ошибке и совершит то же самое, что и вызов open().

Оба эти метода принимают корневой ключ в качестве первого параметра. В JavaScript`е вам достаточно будет использовать в качестве этого параметра какую-то из именованных констант рассматриваемого интерфейса. Вот они:

  • ROOT_KEY_CLASSES_ROOT — Соответствует HKEY_CLASSES_ROOT
  • ROOT_KEY_CURRENT_USER — Соответствует HKEY_CURRENT_USER
  • ROOT_KEY_LOCAL_MACHINE — Соответствует HKEY_LOCAL_MACHINE

Вторым параметром для open() и create() является путь к нужному ключу. Как видно из примера выше, вы должны эскейпировать обратные слэши в строке пути.

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

  • ACCESS_READ — для чтения значений, перебора ключей и получения уведомлений
  • ACCESS_WRITE — для установки значений и создания под-ключей
  • ACCESS_ALL — доступ для всех операций

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

var wrk = Components.classes["@mozilla.org/windows-registry-key;1"]
                    .createInstance(Components.interfaces.nsIWindowsRegKey);
wrk.open(wrk.ROOT_KEY_LOCAL_MACHINE,
         "SOFTWARE\\Microsoft",
         wrk.ACCESS_READ);
var subkey = wrk.openChild("Windows\\CurrentVersion", wrk.ACCESS_READ);
var id = subkey.readStringValue("ProductId");
subkey.close();
wrk.close();

Один раз открыв ключ реестра вы можете начать его использовать.

Далее: Чтение данных из реестра >>>

04.05.2010. Перевод с английского — Д.Скоробогатов (aka xBB)
Благодарность А.Исаеву (aka Loky) за помощь в редактировании
Английский оригинал доступен по адресу https://developer.mozilla.org/en/Accessing_the_Windows_Registry_Using_XPCOM

Биржа долевых инвестиций SIMEX.

Последнее редактирование: 2010-05-05 11:56:16

Метки материала: программирование, xpcom, com, microsoft windows, mozilla, firefox, javascript, js

Оставьте, пожалуйста, свой комментарий к публикации

Представиться как     Антибот:
   

Просьба не постить мусор. Если вы хотите потестить xBB, воспользуйтесь кнопкой предварительного просмотра на панели инструментов xBBEditor-а.


© 2007-2017, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.