Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 324

/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
Мне нужно работать с набором строк - записать в реестр и считать из реестра.
В случае чтения - у меня получилось.
Делаю я это с помощью процедуры
ReadREG_MULTI_SZ (расписана в приложении). А вот записать набор строк корректно у меня не получается. В результате преобразования (также приведены ниже) получаю не набор строк, а одну строку и дальше набор невразумительных символов.
Поскажите как корректно записать Tstrings в параметр REG_MULTI_SZ регистра.

Приложение:
  1. procedure ReadREG_MULTI_SZ(const CurrentKey: HKey; const Subkey, ValueName: string;
  2. Strings: TStrings);
  3. var
  4. valueType: DWORD;
  5. valueLen: DWORD;
  6. p, buffer: PChar;
  7. key: HKEY;
  8. begin
  9. // Clear TStrings
  10. // TStrings leeren
  11. Strings.Clear;
  12. // open the specified key
  13. // CurrentKey Schlussel offnen
  14. if RegOpenKeyEx(CurrentKey,
  15. PChar(Subkey),
  16. 0, KEY_READ, key) = ERROR_SUCCESS then
  17. begin
  18. // retrieve the type and data for a specified value name
  19. // Den Typ und Wert des Eintrags Ermitteln.
  20. SetLastError(RegQueryValueEx(key,
  21. PChar(ValueName),
  22. nil,
  23. @valueType,
  24. nil,
  25. @valueLen));
  26. if GetLastError = ERROR_SUCCESS then
  27. if valueType = REG_MULTI_SZ then
  28. begin
  29. GetMem(buffer, valueLen);
  30. try
  31. // receive the value's data (in an array).
  32. // Ein Array von Null-terminierten Strings
  33. // wird zuruckgegeben
  34. RegQueryValueEx(key,
  35. PChar(ValueName),
  36. nil,
  37. nil,
  38. PBYTE(buffer),
  39. @valueLen);
  40. // Add values to stringlist
  41. // Werte in String Liste einfugen
  42. p := buffer;
  43. while p^ <> #0 do
  44. begin
  45. Strings.Add(p);
  46. Inc(p, lstrlen(p) + 1)
  47. end
  48. finally
  49. FreeMem(buffer)
  50. end
  51. end
  52. else
  53. raise ERegistryException.Create('Stringlist expected/ String Liste erwartet...')
  54. else
  55. raise ERegistryException.Create('Cannot Read MULTI_SZ Value/'+
  56. 'Kann den MULTI_SZ Wert nicht lesen...');
  57. end;
  58. end;
  59.  
  60.  
  61.  
  62. procedure ...
  63. var
  64.  
  65. Buffer: Pointer;
  66. BufSize: DWORD;
  67. i, j, k: Integer;
  68. s: string;
  69. p: PChar;
  70. begin
  71.  
  72.  
  73. BufSize := 0;
  74. for i := 0 to list.Count - 1 do
  75. inc(BufSize, Length(list[i]) + 1);
  76. inc(BufSize);
  77. GetMem(Buffer, BufSize);
  78. k := 0;
  79. p := Buffer;
  80. for i := 0 to list.Count - 1 do
  81. begin
  82. s := list[i];
  83. for j := 0 to Length(s) - 1 do
  84. begin
  85. p[k] := s[j + 1];
  86. inc(k);
  87. end;
  88. p[k] := chr(0);
  89. inc(k);
  90. end;
  91. p[k] := chr(0);
  92.  
  93. end;
  94.  
  95.  
  96.  


Ak_el_a Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задала: Ak_el_a (статус: Посетитель)
Вопрос отправлен: 30 ноября 2012, 21:41
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 29 декабря 2012, 14:00; участников в обсуждении: 1.
mirt.steelwater

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: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:49
Выполнено за 0.03 сек.