Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
2 / 2 / 0
Регистрация: 18.07.2012
Сообщений: 27
1

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

14.07.2017, 18:16. Показов 446. Ответов 2
Метки нет (Все метки)

Ниже представлена процедура чтения и вывода в ListView значений ключа реестра. В чем проблема описано в коде. Подскажите, пожалуйста, из-за чего.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
procedure TForm1.TreeView1Click(Sender: TObject);
var HiveKey: hKey;
    dwIndex, Error: Dword;
    lpValueName: array[0..255]of char;
    lpcbValueName, lpType, lpcbData: dword;
    lpData: PByte;
    LI : TListItem;
    StringValue: String;
    IntegerValue: Integer;
    Int64Value: Int64;
    s: String;
 
begin
  if (TreeView1.Selected <> nil) and (TreeView1.Selected.Parent <> nil) then begin
    dwIndex:=0;
    ListView1.Items.Clear;
    s:= GetPathFromNode(TreeView1.Selected);
    if RegOpenKeyEx(HiveHandle, PChar(s), 0, KEY_QUERY_VALUE, HiveKey) = ERROR_SUCCESS then begin
      Error:= RegEnumValue(HiveKey, dwIndex, lpValueName, lpcbValueName, nil, @lpType, nil, @lpcbData); 
      // В предыдущей строке кода без комментирования строки внизу возвращается 234 ошибка (ERROR_MORE_DATA) 
      while Error = ERROR_SUCCESS do begin
        LI:= Form1.ListView1.Items.Add;
        LI.Caption:= lpValueName;
        GetMem(lpData, lpcbData);
        RegQueryValueEx(HiveKey, lpValueName, nil, @lpType, lpData, @lpcbData);
        case lpType of
          0:
          begin
            LI.SubItems.Add ('REG_NONE');
          end;
          1:
          begin
            LI.SubItems.Add ('REG_SZ');
            SetLength(StringValue, lpcbData-1);
            CopyMemory(@StringValue[1], lpData, lpcbData);
            LI.SubItems.Add (AnsiString(StringValue));
          end;
          2:
          begin
            LI.SubItems.Add ('REG_EXPAND_SZ');
            SetLength(StringValue, lpcbData-1);
            CopyMemory(@StringValue[1], lpData, lpcbData-1);
            LI.SubItems.Add (StringValue);
          end;
          3:
          begin
            LI.SubItems.Add ('REG_BINARY');
            SetLength(StringValue, lpcbData*2);
            BinToHex(lpData, PChar(StringValue), lpcbData*2);
            LI.SubItems.Add(AnsiString(StringValue));
          end;
          4:
          begin
            LI.SubItems.Add ('REG_DWORD');
            CopyMemory(@IntegerValue, lpData, lpcbData-1);
            LI.SubItems.Add (IntToStr(IntegerValue));
          end;
          5:
          begin
            LI.SubItems.Add ('REG_DWORD_BIG_ENDIAN');
            CopyMemory(@IntegerValue, lpData, lpcbData-1);
            LI.SubItems.Add (IntToStr(SwapEndian32(IntegerValue)));
          end;
          6:
          begin
            LI.SubItems.Add ('REG_LINK');
          end;
          7:
          begin
            LI.SubItems.Add ('REG_MULTI_SZ');
            SetLength(StringValue, lpcbData-1);
            CopyMemory(@StringValue[1], lpData, lpcbData-1);
            StringValue:=StringReplace(StringValue,#0,'',[rfreplaceall]);
            LI.SubItems.Add (StringValue);
          end;
          8:
          begin
            LI.SubItems.Add ('REG_RESOURCE_LIST');
          end;
          9:
          begin
            LI.SubItems.Add ('REG_FULL_RESOURCE_DESCRIPTOR');
          end;
          10:
          begin
            LI.SubItems.Add ('REG_RESOURCE_REQUIREMENTS_LIST');
          end;
          11:
          begin
            LI.SubItems.Add ('REG_QWORD');
            CopyMemory(@Int64Value, lpData, lpcbData-1);
           // LI.SubItems.Add(IntToStr(Int64Value));  С закомментированной данной строчкой все работает 
          end;
        end;
        FreeMem(lpData);
        Inc(dwIndex);
        Error:= RegEnumValue(HiveKey, dwIndex, lpValueName, lpcbValueName, nil, @lpType, nil, @lpcbData);
      end;
    end;
    RegCloseKey(HiveKey);
  end;
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2017, 18:16
Ответы с готовыми решениями:

Вывод всех значений параметров из ключа реестра
Всем привет. Делаю маленькую утилитку, столкнулся с проблемой: Нужно вывести все параметры и...

Чтение ключа реестра
Необходимо написать функцию или процедуру, которая бы считывала ключ из реестра, и при запуске...

Доступность чтения ключа из реестра
Всем привет. Нужно узнать какие ключи и ветки в реестре даны для чтения когда я с ограниченной...

Вывести значение ключа реестра в Label
Здравствуйте. У меня к Вам такой вопрос, как вывести значение ключа реестра в Label ?!

__________________
2
Фриланс Pascal/Delphi etc
64 / 73 / 16
Регистрация: 25.11.2016
Сообщений: 263
16.07.2017, 09:02 2
А не проще ли использовать готовый класс TRegistry?
Копаться в WinAPI дело не благодарное.
0
2 / 2 / 0
Регистрация: 18.07.2012
Сообщений: 27
25.07.2017, 17:37  [ТС] 3
ILinker, с чего бы неблагодарное?)) Очень даже полезное. Тем более TRegistry не умеет считывать все типы данных реестра, нужно допиливать. Это как минимум.

Ответ на мой первый вопрос - неправильное выделение памяти для переменных- получателей данных. Достаточно нюансов для некоторых из типов. Просто нужно внимательнее читать msdn. )
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2017, 17:37

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Удаление ключа реестра через DeleteKey
День добрый. Такая проблема - не могу удалить ключ реестра через DeleteKey, в котором ключ указан...

При клике по названию ключа открывать его в редакторе реестра
Суть вопроса вот в чем.Написал програмку для поиска в реестре и решил удобства для сделать...

Получение ProductID из реестра
Требуется спарсить значение ProductID из ветки HKEY_LOCAL_MACHINE\Software\Microsoft...

Получение данных из реестра (RED_DWORD)
Приветствую всех! Есть ключ в реестре, который находится в —...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.