Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2023, 14:56   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Реестр. Бинарные данные в читаемый вид

Доброго времени суток!
Хочу считать бинарные данные из реестра и привести в читаемый вид. Нашёл код 2013 года. Он работает только один раз при втором вызове или при закрытии программы он выдаёт ошибку access violation и перебрасывает на GETMEM.INC вот сюда
Код:
{$ifdef CPU386}
{---------------32-bit BASM SysFreeMem---------------}
...
  {Get the small block type in ebx}
  mov ebx, TSmallBlockPoolHeader[edx].BlockType
Сам код
Код:
function ReadBinary(RootKey: HKEY; SubKey, ValueName: WideString; var Data: String): Bool;
var
  Key: HKEY;
  Buffer: array of Char;
  Size: Cardinal;
  RegType: DWORD;
begin
  Result := False;
  RegType := REG_BINARY;
  if RegOpenKeyExW(RootKey, PWideChar(SubKey), 0, KEY_READ, Key) = ERROR_SUCCESS then
  begin
    if RegQueryValueExW(Key, PWideChar(ValueName), Nil, @RegType, Nil, @Size) = ERROR_SUCCESS then
    begin
      SetLength(Buffer, Size + 1);
      FillChar(Buffer[0], SizeOf(Buffer[0]) * Length(Buffer), #0);
      if RegQueryValueExW(Key, PWideChar(ValueName), Nil, @RegType, @Buffer[0], @Size) = ERROR_SUCCESS then
      begin
        Result := True;
        Data := String(Buffer); // Shows empty or sometimes 1 random char.
      end;
    end;
  end;
  RegCloseKey(Key);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ReadBinary(HKEY_CURRENT_USER, 'SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000008', 'Account Name', str);
  Memo1.Text := str;
end;
Shouldercannon вне форума Ответить с цитированием
Старый 24.04.2023, 15:28   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Поменяйте String(Buffer) на Copy(PChar(@Buffer[0]), 1) и все должно работать нормально.

Иначе он возвращает указатель на локальную переменную, которая уничтожается при выходе (разумеется и память из под нее освобождается)
macomics вне форума Ответить с цитированием
Старый 24.04.2023, 19:13   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Благодарю. Помогло.
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарные данные .bin bmw Помощь студентам 3 08.05.2009 13:25
как можно читать бинарные данные, через UDP? b_gafurov Работа с сетью в Delphi 0 06.04.2009 15:15
Бинарные данные в shell32.dll роздел FTR bmw Windows 4 26.02.2009 17:44
Бинарные данные в delphi Air Общие вопросы Delphi 10 30.01.2009 19:19