Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Устранение проблемы с обрезкой строки при использовании `RegSetValueEx` в Delphi XE2

Delphi , ОС и Железо , Реестр

Устранение проблемы с обрезкой строки при использовании RegSetValueEx в Delphi XE2

Вопрос, который возник у разработчика, использующего Delphi XE2, заключается в том, что при попытке добавить ключ в реестр с помощью функции RegSetValueEx, в реестр записывается только половина строки. Это происходит независимо от того, какого размера строка передается в функцию: будь то строка из 9 символов или из 21, всегда записывается только начальная половина. После тщательного анализа кода и консультации документации, была выявлена и устранена проблема.

Описание проблемы

Разработчик столкнулся с проблемой, когда при попытке добавления строки в реестр с использованием функции RegSetValueEx, записывалось только четыре первых символа строки. При попытке добавить строку большего размера, например, "123456789123456789", в реестре также отображалась только первая часть строки до символа "9".

Пример кода

function AddRegKey(Key: HKEY; Keyname, Value: String): Boolean;
var
  phkResult: HKEY;
begin
  if RegOpenKeyEx(Key, PChar('SOFTWARE\Microsoft\Windows\CurrentVersion\Run'), 0, KEY_SET_VALUE, phkResult) = ERROR_SUCCESS then
  begin
    Result := RegSetValueEx(phkResult, PChar(KeyName), 0, REG_SZ, PChar(Value), (Length(Value) + 1) * SizeOf(Char)) = ERROR_SUCCESS;
    RegCloseKey(phkResult);
  end
  else
    Result := False;
end;

Подтвержденный ответ

Проблема была в том, что разработчик передавал в функцию RegSetValueEx неверное значение для количества байтов строки. В документации указано, что последний параметр этой функции - это количество байтов данных, а не количество символов. Также необходимо учитывать символ завершения строки (null-терминатор), который занимает 2 байта. Таким образом, для корректной работы функции необходимо передать количество байтов, включая символ завершения строки. Исправленный код выглядит так:

function AddRegKey(Key: HKEY; Keyname, Value: String): Boolean;
var
  phkResult: HKEY;
begin
  if RegOpenKeyEx(Key, PChar('SOFTWARE\Microsoft\Windows\CurrentVersion\Run'), 0, KEY_SET_VALUE, phkResult) = ERROR_SUCCESS then
  begin
    Result := RegSetValueEx(phkResult, PChar(KeyName), 0, REG_SZ, PChar(Value), (Length(Value) + 1) * SizeOf(WideChar)) = ERROR_SUCCESS;
    RegCloseKey(phkResult);
  end
  else
    Result := False;
end;

Альтернативный ответ

Также стоит отметить, что для работы с реестром можно использовать класс TRegistry, который автоматически обрабатывает подобные детали, избавляя от необходимости писать такой код самостоятельно:

uses
  ..., Registry;

function AddRegKey(Key: HKEY; Keyname, Value: String): Boolean;
var
  Reg: TRegistry;
begin
  Result := False;
  try
    Reg := TRegistry.Create(KEY_READ or KEY_WRITE);
    try
      Reg.RootKey := Key;
      if Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run', True) then
      try
        Reg.WriteString(KeyName, Value);
        Result := True;
      finally
        Reg.CloseKey;
      end;
    finally
      Reg.Free;
    end;
  except
    on E: Exception do
      // Обработка исключений
  end;
end;

Использование класса TRegistry упрощает работу с реестром и снижает вероятность ошибок, связанных с неправильной обработкой строк и байтов.

Создано по материалам из источника по ссылке.

Разработчик столкнулся с проблемой обрезки строки при записи в реестр через функцию `RegSetValueEx` в Delphi XE2, так как в реестр записывалась только начальная часть строки из-за ошибки в передаче размера строки.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Реестр ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-13 21:06:07/0.0033290386199951/0