Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не считывается информация из реестра 
V
    Опции темы
VanHelsing
Дата 5.7.2011, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



Пытаюсь считать из реестра список программ имеющих деинсталяторы. 
Делаю это следующим образом.
Код

  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 является пустым, хотя информация в самом реестре имеется.


--------------------
PM MAIL   Вверх
yaevgen3
Дата 5.7.2011, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 4.7.2011

Репутация: нет
Всего: нет



похоже регистр имеет значение тут
я написал вот так и все ключи вывелись 
Код

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

PM WWW   Вверх
northener
Дата 6.7.2011, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



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


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
VanHelsing
Дата 6.7.2011, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



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

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



--------------------
PM MAIL   Вверх
Snowy
Дата 6.7.2011, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Права не позволяют открыть локалмашин не в ридонли режиме.
Код

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

PM MAIL   Вверх
VanHelsing
Дата 6.7.2011, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



Не знаю почему-то не работает. Возвращает все равно 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 программ, интересно, а где остальные программы хранятся или они скрыты каким-то образом?

Это сообщение отредактировал(а) VanHelsing - 6.7.2011, 10:23


--------------------
PM MAIL   Вверх
Snowy
Дата 6.7.2011, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Код
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;

PM MAIL   Вверх
northener
Дата 6.7.2011, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



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

UniNstall


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
VanHelsing
Дата 6.7.2011, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



Цитата

UniNstall

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

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

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

или
Код

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

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

a := StrList[i];


Это сообщение отредактировал(а) VanHelsing - 6.7.2011, 15:36


--------------------
PM MAIL   Вверх
VanHelsing
Дата 6.7.2011, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



Спасибо за помощь.

Это сообщение отредактировал(а) VanHelsing - 11.7.2011, 18:28


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0687 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.