При работе с реестром в Delphi иногда возникают проблемы, связанные с получением данных определенных типов. Одной из таких проблем является получение строковых данных из ключей реестра типа "REG_BINARY". В данной статье мы рассмотрим, как можно решить проблему, когда функция чтения данных из реестра возвращает пустую строку.
Описание проблемы
Разработчик столкнулся с проблемой, при попытке получить данные типа "REG_BINARY" из реестра в виде строки, функция ReadBinString возвращала пустую строку. Код функции и пример ключа реестра представлены ниже.
function ReadBinString(key: string; AttrName: string): string;
var
ReadStr: TRegistry;
begin
// Инициализация TRegistry с правами записи и 64-битным режимом
ReadStr := TRegistry.Create(KEY_WRITE OR KEY_WOW64_64KEY);
ReadStr.RootKey := HKEY_LOCAL_MACHINE;
try
if ReadStr.OpenKey(key, true) then
Result := ReadStr.GetDataAsString(AttrName);
finally
ReadStr.CloseKey;
ReadStr.Free;
end;
end;
Пример ключа реестра:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\ZES\ACINFO]
"iamthere"=dword:00000001
"ArrayOrder"=hex:4d,79,45,78,63,6c,75,64,65
Подход к решению
Для решения проблемы важно обратить внимание на следующие моменты:
Использование правильных флагов доступа к реестру. Необходимо использовать KEY_READ для чтения данных, а не KEY_WRITE.
Замена метода GetDataAsString на чтение данных в бинарном формате с помощью ReadBinaryData.
Использование TEncoding для декодирования байтового массива в строку.
Пример исправленной функции
function ReadBinString(key: string; AttrName: string): string;
var
ReadStr: TRegistry;
Bytes: TBytes;
Encoding: TEncoding;
begin
Encoding := TEncoding.ANSI;
Result := '';
ReadStr := TRegistry.Create(KEY_READ OR KEY_WOW64_64KEY);
ReadStr.RootKey := HKEY_LOCAL_MACHINE;
try
if ReadStr.OpenKeyReadOnly(key) then
begin
SetLength(Bytes, ReadStr.GetDataSize(AttrName));
ReadStr.ReadBinaryData(AttrName, Pointer(Bytes)^, Length(Bytes));
Result := Encoding.GetString(Bytes);
end;
finally
ReadStr.Free;
end;
end;
Выводы
Используйте KEY_READ для чтения данных из реестра.
Применяйте ReadBinaryData для чтения бинарных данных.
Декодируйте байтовый массив в строку с помощью TEncoding.GetString().
Следуя этим рекомендациям, вы сможете успешно получать данные типа "REG_BINARY" из реестра в виде строк в приложениях на Delphi.
Разработчик в Delphi столкнулся с проблемой чтения данных типа 'REG_BINARY' из реестра, когда функция возвращала пустую строку, и ищет решение, изменив методы доступа и декодирования.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.