Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.04.2014, 23:31
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание Почему не получаеться добавить REG_MULTI_SZ

Код:
procedure TRegistry.WriteStringList(const name: string; list: TStringList);
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);

  {запись в реестр}
  if RegSetValueEx(CurrentKey, PwideChar(name), 0, REG_MULTI_SZ, Buffer,
    BufSize) <> ERROR_SUCCESS then
    raise Exception.Create('Error RegistryExt Write Param '+name);
end;

Код:
s1 := TStringlist.Create;
s1.Add('d:\pagefile.sys 0 0');
try
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.OpenKey('SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management', true) then
reg.WriteStringList('PagingFiles', s1);
finally
reg.CloseKey;
reg.Free;
end;
В результате ключ PagingFiles получает значение d:\pagef и все...??
в чем проблема то??
__________________
Нет ничего не возможного. Вопрос только во времени...

Последний раз редактировалось Electronic_Arts, 07.04.2014 в 23:35.
Ответить с цитированием
  #2  
Старый 07.04.2014, 23:53
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Electronic_Arts
Код:
procedure TRegistry.WriteStringList(const name: string; list: TStringList);
.....
  {подготовим буфер к записи}
  BufSize := 0;
  for i := 0 to list.Count - 1 do
    inc(BufSize, Length(list[i]) + 1);
  inc(BufSize);
  GetMem(Buffer, BufSize);
.....
В результате ключ PagingFiles получает значение d:\pagef и все...??
в чем проблема то??
Видимо проблема в том, что в Delphi XE5 каждый символ строки занимает 2 байта, а размер буфера ты вычисляешь в символах, т.е. в 2 раза меньше необходимого.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Electronic_Arts (08.04.2014)
  #3  
Старый 08.04.2014, 00:17
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Цитата:
Сообщение от poli-smen
Видимо проблема в том, что в Delphi XE5 каждый символ строки занимает 2 байта, а размер буфера ты вычисляешь в символах, т.е. в 2 раза меньше необходимого.
Yahoooo как я не догадался ведь пробелы же это один байт а символы по 2

Решено!
Код:
var

  Buffer: Pointer;
  BufSize: word;
  i, j, k: Integer;
  s: string;
  p: PChar;
begin
{подготовим буфер к записи}
  BufSize := 0;
  for i := 0 to list.Count -1 do
    inc(BufSize, Length(list[i]) * 2);
  inc(BufSize);
  GetMem(Buffer, BufSize);
...
..
..

и один лишний пробел добавляем сюда
Код:
s1.Add('d:\pagefile.sys 0 0 ');
и все
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием
  #4  
Старый 08.04.2014, 01:41
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Решено, да неправильно.
Код:
inc(BufSize, Length(list[i]) * SizeOf(Char)); 
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Electronic_Arts (08.04.2014)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:07.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter