|
Вопрос # 6 324/ вопрос решён / |
|
Доброго времени суток, уважаемые эксперты!
Мне нужно работать с набором строк - записать в реестр и считать из реестра.
В случае чтения - у меня получилось.
Делаю я это с помощью процедуры
ReadREG_MULTI_SZ (расписана в приложении). А вот записать набор строк корректно у меня не получается. В результате преобразования (также приведены ниже) получаю не набор строк, а одну строку и дальше набор невразумительных символов.
Поскажите как корректно записать Tstrings в параметр REG_MULTI_SZ регистра.
Приложение: Переключить в обычный режим- procedure ReadREG_MULTI_SZ(const CurrentKey: HKey; const Subkey, ValueName: string;
- Strings: TStrings);
- var
- valueType: DWORD;
- valueLen: DWORD;
- p, buffer: PChar;
- key: HKEY;
- begin
- // Clear TStrings
- // TStrings leeren
- Strings.Clear;
- // open the specified key
- // CurrentKey Schlussel offnen
- if RegOpenKeyEx(CurrentKey,
- PChar(Subkey),
- 0, KEY_READ, key) = ERROR_SUCCESS then
- begin
- // retrieve the type and data for a specified value name
- // Den Typ und Wert des Eintrags Ermitteln.
- SetLastError(RegQueryValueEx(key,
- PChar(ValueName),
- nil,
- @valueType,
- nil,
- @valueLen));
- if GetLastError = ERROR_SUCCESS then
- if valueType = REG_MULTI_SZ then
- begin
- GetMem(buffer, valueLen);
- try
- // receive the value's data (in an array).
- // Ein Array von Null-terminierten Strings
- // wird zuruckgegeben
- RegQueryValueEx(key,
- PChar(ValueName),
- nil,
- nil,
- PBYTE(buffer),
- @valueLen);
- // Add values to stringlist
- // Werte in String Liste einfugen
- p := buffer;
- while p^ <> #0 do
- begin
- Strings.Add(p);
- Inc(p, lstrlen(p) + 1)
- end
- finally
- FreeMem(buffer)
- end
- end
- else
- raise ERegistryException.Create('Stringlist expected/ String Liste erwartet...')
- else
- raise ERegistryException.Create('Cannot Read MULTI_SZ Value/'+
- 'Kann den MULTI_SZ Wert nicht lesen...');
- end;
- end;
-
-
-
- procedure ...
- 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);
-
- end;
-
-
-
 |
Вопрос задала: Ak_el_a (статус: Посетитель)
Вопрос отправлен: 30 ноября 2012, 21:41
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 1; последнее сообщение — 29 декабря 2012, 14:00; участников в обсуждении: 1.
|
mirt.steelwater (статус: Посетитель), 29 декабря 2012, 14:00 [#1]:
Процедура - какая-то страшная ахинея.
Для преобразования строк в PChar используй приведение типов:
p := PChar(s);
Для чтения и записи в реестр используй модуль registry.
Зачем еще какие-то страшные библиотеки?
function RegReadStrings (const RootKey: HKEY; const Key, ValueName: String; var List: TStrings) : Boolean;
var
reg : TRegistry;
begin
reg := TRegistry.Create;
try
reg.RootKey := RootKey;
Result := reg.OpenKey (key,False);
if Result then
begin
List.Text := reg.ReadString (ValueName);
end;
finally
FreeAndNil (reg);
end;
end;
function RegWriteStrings (const RootKey: HKEY; const Key, ValueName: String; const List: TStrings) : Boolean;
var
reg : TRegistry;
begin
reg := TRegistry.Create;
try
reg.RootKey := RootKey;
Result := reg.OpenKey (key,True);
if Result then
begin
reg.WriteString (ValueName,List.Text);
end;
finally
FreeAndNil (reg);
end;
end;
Ⓐ свобода сопротивление солидарность
|
18 марта 2013, 21:31: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|