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

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

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

Чтение данных из реестра

Вероятно, большинство действий, осуществляющихся над реестром Windows, — это чтение значений. На простых примерах выше уже было показано, как читать существующие строковые значения. Однако, значения в реестре Windows могут быть нескольких типов. Поэтому вам нужен способ убедиться в том, что вы читаете данные нужного типа.

Вы можете проверить тип значения с помощью метода getValueType(). Этот метод возвращает целочисленный индикатор типа данных значения. Типам данных, поддерживаемым рассматриваемым интерфейсом, сопоставлены следующие именованные константы:

  • TYPE_NONE — вероятно, бесполезное значение
  • TYPE_STRING — строковое значение в юникоде
  • TYPE_BINARY — бинарные данные
  • TYPE_INT — 32-битное целое
  • TYPE_INT64 — 64-битное целое

Для каждого из этих типов (кроме TYPE_NONE) существует соответствующий метод для чтения значений подходящего типа:

  • readStringValue()
  • readBinaryValue()
  • readIntValue()
  • readInt64Value()

Поскольку JavaScript является языком с динамической типизацией, вы можете использовать следующий код для обработки данных любых типов. В этой функции предполагается, что wrk — уже созданный объект, реализующий nsIWindowsRegKey.

function readRegistryValue(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;
}

Запись данных в реестр

Запись значений реестра также проста, как и чтение. Для каждого поддерживаемого типа данных в интерфейсе существует метод write*Value(), аналогичный методу read*Value(). Только помните, что перед записью значения вы должны предварительно создать его родительский ключ с помощью create(). Следующий пример демонстрирует запись нового строкового значения:

var wrk = Components.classes["@mozilla.org/windows-registry-key;1"]
                    .createInstance(Components.interfaces.nsIWindowsRegKey);
wrk.create(wrk.ROOT_KEY_CURRENT_USER,
           "SOFTWARE\\MDC\\Test",
           wrk.ACCESS_WRITE);
wrk.writeStringValue("TestValue", "Hello World!");
wrk.close();

Проверка существования ключей и значений

Перед попыткой прочесть значение или открыть дочерний ключ, вы должны проверить его существование. Интерефейс nsIWindowsRegKey предоставляет для этого методы hasValue() и hasChild(), использование которых демонстрируется в следующем примере:

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);
if (wrk.hasChild("Windows")) {
  var subkey = wrk.openChild("Windows\\CurrentVersion", wrk.ACCESS_READ);
  var id;
  if (subkey.hasValue("ProductId"))
    id = subkey.readStringValue("ProductId");
  subkey.close();
}
wrk.close();

Перебор ключей реестра и их значений

В некоторых случаях вам может понадобиться перебрать все ключи или значения, имена которых вам неизвестны. Интерфейс nsIWindowsRegKey предоставляет свойства и меторды childCount, getChildName(), valueCount и getValueName() для перебора ключей и значений в указанном порядке. Вы можете использовать эти методы для прочтения списка значений или для рекурсивного обхода ветви реестра. Следующий пример считывает информацию об автозапускаемых при старте 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\\Run",
         wrk.ACCESS_READ);
for (var i=0; i<wrk.valueCount; i++) {
  var name  = wrk.getValueName(i);
  var value = readRegistryValue(wrk, name);
  // здесь все самое интересное...
}
wrk.close();

Этот пример для простоты предполагает существование определенной выше функции readRegistryValue().

Удаление ключей реестра и значений

Для удаления из реестра дочерних ключей и значений вы можете использовать методы removeChild() и removeValue(). Метод removeChild() удаляет дочерний ключ и все его значения, но завершится ошибкой, если ключ в свою очередь имеет дочерние ключи. В таком случае вы должны вручную перебрать всех его потомков и удалить каждый из них отдельно. Следующий пример показывает, как рекурсивно удалять ключи реестра со всеми их потомками. Используйте осторожно!

function removeChildrenRecursive(wrk)
{
  // мы ведем подсчет счет в обратном направлении,
  // так как удаляем элементы по ходу дела
  for (var i = wrk.childCount - 1; i >= 0; i--) {
    var name   = wrk.getChildName(i);
    var subkey = wrk.openChild(name, wrk.ACCESS_ALL);
    removeChildrenRecursive(subkey);
    subkey.close();
    wrk.removeChild(name);
  }
}

var wrk = Components.classes["@mozilla.org/windows-registry-key;1"]
                    .createInstance(Components.interfaces.nsIWindowsRegKey);
wrk.open(wrk.ROOT_KEY_CURRENT_USER,
         "SOFTWARE\\MDC\\Test",
         wrk.ACCESS_ALL);
removeChildrenRecursive(wrk);
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:57:30

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

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

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

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


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