Устранение проблемы с обрезкой строки при использовании 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.