|
Вопрос # 1 307/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Прочитав из реестра параметр типа MultiString получаю строку 'str1'#0'str2'#0'str3'. Как бы ее эффективно представить в одной строке чтобы было возможно восстановить этот параметр?
 |
Вопрос задал: Евгений 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, как вы указали строку в вопросе.
Желаю удачи...
Приложение: Переключить в обычный режим- uses
- Registry;
-
- 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
- Strings.Clear;
- // open the specified key
- if RegOpenKeyEx(CurrentKey,
- PChar(Subkey),
- 0, KEY_READ, key) = ERROR_SUCCESS then
- begin
- // retrieve the type and data for a specified value name
- 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).
- RegQueryValueEx(key,
- PChar(ValueName),
- nil,
- nil,
- PBYTE(buffer),
- @valueLen);
- // Add values to stringlist
- 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;
-
- // Test it:
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- ReadREG_MULTI_SZ(HKEY_CURRENT_USER, 'Software\XYZ', 'Test44', Memo1.Lines);
- end;
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 4 февраля 2008, 13:05
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 4 февраля 2008, 13:08; участников в обсуждении: 2.
|
min@y™ (статус: Доктор наук), 4 февраля 2008, 08:46 [#1]:
MultiString - это что-то новое. Не слыхал. Может быть REG_SZ?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Feniks (статус: Бакалавр), 4 февраля 2008, 13:08 [#2]:
Все верно. Есть такой тип в Windows NT. В более старых версия 9х его еще не было.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|