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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 1 307

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Прочитав из реестра параметр типа MultiString получаю строку 'str1'#0'str2'#0'str3'. Как бы ее эффективно представить в одной строке чтобы было возможно восстановить этот параметр?

Евгений Eklmn Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Евгений Eklmn (статус: Посетитель)
Вопрос отправлен: 2 февраля 2008, 15:49
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, Трофимов Евгений!
Параметры типа REG_MULTI_SZ в реестре хранятся в виде нуль-терминальной строки, т.е. каждая строка заканчивается специальным код-маркером #0. Далее все просто. Надо вырезать эти маркеры. Или заменить их на нужный Вам знак-разделитель, или вырезать каждую строку отдельно в список. Это уже смотря, что именно Вам надо с ними делать.
В приложении простой пример чтения такой строки и разбор ее в Memo1.Lines.

Пару примеров по вырезанию и замене маркера на коды #13#10:
Пример №1:

repeat
         p := Pos(#0, tmpStr);
         if p <> 0 then
         begin
           Delete(tmpStr, p, 1);
           Insert(#13#10, tmpStr, p);
         end;
       until p = 0;
Пример №2:
StringReplace(tmpStr, #0, #13#10, [rfReplaceAll]);
А для записи такой строки в реестр делаете обратное преобразование, т.е. собираете все свои строки через код #0, как вы указали строку в вопросе.
Желаю удачи...

Приложение:
  1. uses
  2. Registry;
  3.  
  4. procedure ReadREG_MULTI_SZ(const CurrentKey: HKey; const Subkey, ValueName: string;
  5. Strings: TStrings);
  6. var
  7. valueType: DWORD;
  8. valueLen: DWORD;
  9. p, buffer: PChar;
  10. key: HKEY;
  11. begin
  12. // Clear TStrings
  13. Strings.Clear;
  14. // open the specified key
  15. if RegOpenKeyEx(CurrentKey,
  16. PChar(Subkey),
  17. 0, KEY_READ, key) = ERROR_SUCCESS then
  18. begin
  19. // retrieve the type and data for a specified value name
  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. RegQueryValueEx(key,
  33. PChar(ValueName),
  34. nil,
  35. nil,
  36. PBYTE(buffer),
  37. @valueLen);
  38. // Add values to stringlist
  39. p := buffer;
  40. while p^ <> #0 do
  41. begin
  42. Strings.Add(p);
  43. Inc(p, lstrlen(p) + 1)
  44. end
  45. finally
  46. FreeMem(buffer)
  47. end
  48. end
  49. else
  50. raise ERegistryException.Create('Stringlist expected/ String Liste erwartet...')
  51. else
  52. raise ERegistryException.Create('Cannot Read MULTI_SZ Value/'+
  53. 'Kann den MULTI_SZ Wert nicht lesen...');
  54. end;
  55. end;
  56.  
  57. // Test it:
  58.  
  59. procedure TForm1.Button1Click(Sender: TObject);
  60. begin
  61. ReadREG_MULTI_SZ(HKEY_CURRENT_USER, 'Software\XYZ', 'Test44', Memo1.Lines);
  62. end;


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 4 февраля 2008, 13:05


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

Всего сообщений: 2; последнее сообщение — 4 февраля 2008, 13:08; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 4 февраля 2008, 08:46 [#1]:

MultiString - это что-то новое. Не слыхал. Может быть REG_SZ?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Feniks

Feniks (статус: Бакалавр), 4 февраля 2008, 13:08 [#2]:

Все верно. Есть такой тип в Windows NT. В более старых версия 9х его еще не было.

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 17 августа 2017, 11:00
Выполнено за 0.13 сек.
Рейтинг@Mail.ru