Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Не считывается информация из реестра


Автор: VanHelsing 5.7.2011, 21:46
Пытаюсь считать из реестра список программ имеющих деинсталяторы. 
Делаю это следующим образом.
Код

  StrList := TStringList.Create;
  reg := TRegistry.Create; // создание объекта для работы с реестром
  Reg.RootKey := Windows.HKEY_LOCAL_MACHINE; //загрузка раздела HKEY_LOCAL_MACHINE
  // открываем ключ раздела в котором содержится деинсталяторы программ
  Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Unistall', False);
  Reg.GetKeyNames(StrList); // получаем все подразделы этого ключа
  //Перебор всех подключей текущего ключа, и поиска подключа - InterBase 6.5
  for i := 0 to StrList.Count - 1 do
    begin
      Reg.CloseKey;
      Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Unistall'+StrList[i], false);
      a := Reg.ReadString('DisplayName'); // читаем название раздела
      lst1.Items.Add(a);
      if (a = '') then a := Reg.ReadString('QuietDisplayName');
      if (a = 'InterBase 6.5') then
        begin
          KeyRemove := Reg.ReadString('UninstallString'); // найденый ключ
          if (KeyRemove = '') then
            KeyRemove := Reg.ReadString('QuietUninstallString');
          FindRegistry := True; //нужный подключ найден
        end;
    end;
  Reg.Free;

Почему-то в результате выполнения данного кода список StrList является пустым, хотя информация в самом реестре имеется.

Автор: yaevgen3 5.7.2011, 22:10
похоже регистр имеет значение тут
я написал вот так и все ключи вывелись 
Код

Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', False);

Автор: northener 6.7.2011, 00:02
А вот если бы помнили/знали, что TRegistry.OpenKey это функция и взяли себе за правило проверять её результат (да и вообще результат всех функций), то эта дурацкая очепятка легко бы нашлась под отладчиком!

Автор: VanHelsing 6.7.2011, 08:37
Регистр я изменил, но ничего не помогло, OpenKey возвращает False.
Код

  Res := Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Unistall', False);
  if Res then Reg.GetKeyNames(StrList) // получаем все подразделы этого ключа
  else
    begin
      mmoReportSetup.Lines.Add('Загрузка ключей не удалась');
      Exit;
    end;

Автор: Snowy 6.7.2011, 09:31
Права не позволяют открыть локалмашин не в ридонли режиме.
Код

  reg := TRegistry.Create(KEY_READ); // READONLY!!!
  Reg.RootKey := Windows.HKEY_LOCAL_MACHINE;
  Reg.OpenKeyReadOnly('Software\Microsoft\Windows\CurrentVersion\Unistall', False); // READONLY!!!

Автор: VanHelsing 6.7.2011, 09:54
Не знаю почему-то не работает. Возвращает все равно FALSE.
Код

  Reg := TRegistry.Create(KEY_READ); // создание объекта для работы с реестром
  Reg.RootKey := Windows.HKEY_LOCAL_MACHINE; //загрузка раздела HKEY_LOCAL_MACHINE
  // открываем ключ раздела в котором содержится деинсталяторы программ
  Res := Reg.OpenKeyReadOnly('Software\Microsoft\Windows\CurrentVersion\Unistall');

P.S. еще один небольшой вопрос. Открыв раздел реестра Software\Microsoft\Windows\CurrentVersion\Unistall я увидел там всего 5 программ, интересно, а где остальные программы хранятся или они скрыты каким-то образом?

Автор: Snowy 6.7.2011, 12:32
Код
var
  StrList: Tstrings;
  i: integer;
  a: string;
  KeyRemove: string;
  FindRegistry: Boolean;
  Key: Hkey;
  Reg: TRegistry;
begin
  StrList := TStringList.Create;
  reg := TRegistry.Create(KEY_READ); // создание объекта для работы с реестром
  Reg.RootKey := Windows.HKEY_LOCAL_MACHINE; //загрузка раздела HKEY_LOCAL_MACHINE
  Reg.Access := $0300;
  Reg.OpenKeyReadOnly('Software\Microsoft\Windows\CurrentVersion\Uninstall');
  Reg.GetKeyNames(StrList);
  for i := 0 to StrList.Count - 1 do
    begin
      a := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+StrList[i];
      Reg.OpenKeyReadOnly(a);
      a := Reg.ReadString('DisplayName');
      if a='' then a := StrList[i];
      lst1.Items.Add(a);
      Reg.CloseKey;
      if (a = '') then a := Reg.ReadString('QuietDisplayName');
      if (a = 'InterBase 6.5') then
        begin
          KeyRemove := Reg.ReadString('UninstallString'); // найденый ключ
          if (KeyRemove = '') then
            KeyRemove := Reg.ReadString('QuietUninstallString');
          FindRegistry := True; //нужный подключ найден
        end;
    end;
  Reg.Free;
end;

Автор: northener 6.7.2011, 13:32
Цитата(VanHelsing @  6.7.2011,  09:54 Найти цитируемый пост)
Открыв раздел реестра Software\Microsoft\Windows\CurrentVersion\Unistall

UniNstall

Автор: VanHelsing 6.7.2011, 15:31
Цитата

UniNstall

Это я исправил ранее.
Snowy спасибо большое. Подразделы считаются, но значения почему-то в них пустые. Такое возможно? 

Разобрался. Если при считывании 
Код

a := Reg.ReadString('DisplayName');

или
Код

a := Reg.ReadString('QuietDisplayName');

результат получается пустой, записываем имя подраздела.
Код

a := StrList[i];

Автор: VanHelsing 6.7.2011, 21:31
Спасибо за помощь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)