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

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

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

Мониторинг ключей реестра

Если вам нужно в реальном режиме времени отслеживать изменение в реестре значения для какого-то ключа, вам следует использовать методы startWatching(), stopWatching(), и hasChanged(). Вы должны вызвать метод startWatching() для начала мониторинга значения ключа. Этот метод принимает единственный параметр логического типа, указывающий, следует ли отслеживать изменения дочерних ключей.

После этого следует вызывать hasChanged(), чтобы определить, нужно или нет заново читать значения ключей после их изменения. Вызов hasChanged() автоматически сбрасывает индикатор наличия изменения, так что вы можете быть уверены, что если этот метод возвращает true, то имели место изменения. Следующий пример демонстрирует простейшую реализацию кэша для одного ключа реестра:

var cache = {};

function readRegistryValueNoCache(wrk, value)
{
  switch (wrk.getValueType(value)) {
    case wrk.TYPE_STRING:
      return wrk.readStringValue(value);
    case wrk.TYPE_BINARY:
      return wrk.readBinaryValue(value);
    case wrk.TYPE_INT:
      return wrk.readIntValue(value);
    case wrk.TYPE_INT64:
      return wrk.readInt64Value(value);
  }
  // неизвестный тип
  return null;
}

function readRegistryValue(wrk, value)
{
  if (wrk.hasChanged()) {
    // очищаем кэш
    cache = {};
  }

  if (value in cache) {
    return cache[value];
  }

  cache[value] = readRegistryValueNoCache(wrk, value);
  return cache[value];
}

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);
wrk.startWatching(false); // only watch the values on this key, not child keys
var id = readRegistryValue(wrk, "ProductId");
/* позже вы сможете прочесть его снова уже из кэша,
   если только он не будет изменен в реестре.
   Не забудьте вызвать wrk.close(), когда закончите!
*/

Поддержка в Firefox 1.0

Firefox 1.0 включает в себя сильно упрощенный интерфейс для работы с реестром Windows, без большинства функциональных возможностей, поддерживаемых в более новых версиях. Та функциональность, какая есть, доступна с помощью интерфейса nsIWindowsShellService. Она состоит из единственного метода, — getRegistryEntry(), — и набора именованных констант для указания корневого ключа. Вы можете использоватьи их, как показано в следующем примере:

var wss = Components.classes["@mozilla.org/browser/shell-service;1"]
                    .getService(Components.interfaces.nsIWindowsShellService);
var id = wss.getRegistryEntry(wss.HKLM,
                              "SOFTWARE\\Microsoft\\Windows\\CurrentVersion",
                              "ProductId");

Замечание: этот интерфейс не поддерживает возможности установить какое-либо значение реестра.

Поддержка в SeaMonkey и других отдельных приложениях

В старых версиях SeaMonkey и в других приложениях, развивающихся отдельно от Firefox, существует интерфейс nsIWindowsRegistry, содержащий такие же методы и именованные константы, как и описанные выше для Firefox 1.0. Они могут быть использованы следующим образом:

var wss = Components.classes["@mozilla.org/winhooks;1"]
                    .getService(Components.interfaces.nsIWindowsRegistry);
var id = wss.getRegistryEntry(wss.HKLM,
                              "SOFTWARE\\Microsoft\\Windows\\CurrentVersion",
                              "ProductId");

Обратная совместимость

Если вам необходима поддержка Firefox 1.0 и других старых версий браузера, вы должны проверять, какой из интерфейсов вам доступен. Следующий скелетный код позволит вам определить, какой интерфейс следует использовать:

if ("@mozilla.org/windows-registry-key;1" in Components.classes) {
  // Firefox 1.5 и старше
}
else if ("@mozilla.org/winhooks;1" in Components.classes) {
  // SeaMonkey или другие отдельные приложения
}
else if ("@mozilla.org/browser/shell-service;1" in Components.classes) {
  var wss = Components.classes["@mozilla.org/browser/shell-service;1"]
                      .getService(Components.interfaces.nsIWindowsShellService);
  if ("getRegistryEntry" in wss) {
    // Firefox 1.0
  }
  else {
    // нет поддержки
  }
}
else {
  // нет поддержки
}

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

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

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

Метки материала: расширение, ос, открытое по, описание интерфейсов, методы, метод, компонентная объектная модель, интерфейс, интернет-браузер, interface, component object model, com, операционная система, объекты, объект, интерфейсы, браузеры, браузер, microsoft windows

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

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

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


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