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
103
104
105
106
107
108
109
110
111
112
113
114
| unit RegistryExt;
{$R-,T-,H+,X+}
// скачан с
// [url]http://www.delphisources.ru/pages/faq/base/ex_tregistry.html[/url]
// подправлен
// [email]alexpac26@yandex.ru[/email] май 2012
interface
uses Registry, Classes, Windows, Consts, SysUtils;
type
TRegistry = class(Registry.TRegistry)
public
function ReadStringList(const name: string):TStringList;
procedure WriteStringList(const name: string; list: TStringList);
end;
implementation
//*** TReg *********************************************************************
//------------------------------------------------------------------------------
// Запись TStringList ввиде значения типа REG_MULTI_SZ в реестр
//------------------------------------------------------------------------------
procedure TRegistry.WriteStringList(const name: string; list: TStringList);
var
Buffer: Pointer;
BufSize: DWORD;
i, j, k: Integer;
s: string;
p: PChar;
begin
{подготовим буфер к записи}
BufSize := 0;
for i := 0 to list.Count - 1 do
inc(BufSize, Length(list[i]) + 1);
inc(BufSize);
GetMem(Buffer, BufSize);
k := 0;
p := Buffer;
for i := 0 to list.Count - 1 do
begin
s := list[i];
for j := 0 to Length(s) - 1 do
begin
p[k] := s[j + 1];
inc(k);
end;
p[k] := chr(0);
inc(k);
end;
p[k] := chr(0);
{запись в реестр}
if RegSetValueEx(CurrentKey, PChar(name), 0, REG_MULTI_SZ, Buffer,
BufSize) <> ERROR_SUCCESS then
raise Exception.Create('Error RegistryExt Write Param '+name);
end;
//------------------------------------------------------------------------------
// Чтение TStringList ввиде значения типа REG_MULTI_SZ из реестра
//------------------------------------------------------------------------------
function TRegistry.ReadStringList(const name: string):TStringList;
var
BufSize,
DataType: DWORD;
Len, i: Integer;
Buffer: PChar;
s: string;
begin
result:=TStringList.Create;
Len := GetDataSize(Name);
if Len < 1 then
Exit;
Buffer := AllocMem(Len);
if Buffer = nil then
Exit;
try
DataType := REG_NONE;
BufSize := Len;
if RegQueryValueEx(CurrentKey, PChar(name), nil, @DataType, PByte(Buffer),
@BufSize) <> ERROR_SUCCESS then
//raise ERegistryException.CreateResFmt(@SRegGetDataFailed, [name]);
raise Exception.Create('Error RegistryExt Get Data Failed on '+name);
if DataType <> REG_MULTI_SZ then
//raise ERegistryException.CreateResFmt(@SInvalidRegType, [name]);
raise Exception.Create('Error RegistryExt Invalid RegType on '+name);
{запись в TStringList}
s := '';
for i := 0 to BufSize - 2 do
begin // BufSize-2 т.к. последние два нулевых символа
if Buffer[i] = chr(0) then
begin
result.Add(s);
s := '';
end
else
s := s + Buffer[i];
end;
finally
FreeMem(Buffer);
end;
end;
end. |