Zapis do rejestru stringa ze znakiem #0

0

Witam,
Mam problem z zapisem stringa do rejestru - może ktoś już miał taki problem.
Używam procedury WriteString z klasy TRegistry.

Wywołanie

var s : string;
begin
s := 'ala' + #0 + 'ma' + #0 + 'kota';
...
reg.WriteString('Test', s);
...
end;

Po wywołaniu powyższego kodu do rejestru zostanie wpisane 'ala'. Reszta jest obcinana.
Znak #0 musi być w tym stringu, nie pełni roli żadnego separatora ale jest wymagany z innych przyczyn, których nie chcę opisywać.

Z góry dziękuję za każdą odpowiedź.

0

Nie da się jako string zapisuj jako dane binarne:

var
  reg: TRegistry;
  s: AnsiString;
begin
  s := 'ala' + #0 + 'ma' + #0 + 'kota';
  reg:= TRegistry.Create;
  try
  reg.RootKey:= HKEY_CURRENT_USER;
  if reg.OpenKey('Test', True) then
    reg.WriteBinaryData('Test', s[1], Length(s));
  finally
  reg.Free;
  end;
0

Możesz też zamienić znak #0 na jakiś "przyzwoity" znak.
Po odczycie z rejestru odczytać ponownie.

0
GallAnnonimm napisał(a)

Reszta jest obcinana.

Dzieje się tak, ponieważ funkcje WinAPI (i chyba właściwie każdego systemu operacyjnego) operują na PChar-ach (które z kolei są null-terminated, tak więc znak #0 zakańcza ciąg, w porównaniu do Pascalowych Stringów, które mają zapisaną swoją długość, więc wewnątrz mogą występować dowolne znaki).
Innymi słowy: #0 nie powinno występować w stringach przekazywanych do funkcji odwołujących się do Windowsowego API; zamień to np.na przecinek bądź cokolwiek innego.

0

Dziękuję bardzo i pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1