Как получить данные из REG_MULTY_SZ?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как получить данные из REG_MULTY_SZ?

Сообщение Виталий » 06.03.2015 13:27:12

Добрый день всем.
Как используя TRegistry получить данные из мультистроки типа REG_MULTY_SZ?
В Лазарусе ReadString() и ReadBinary() бьют ошибку несовместимости типа значения ветки, ибо такого типа в генофонде Лазаря не предусмотрено вообще.
Виталий
новенький
 
Сообщения: 40
Зарегистрирован: 05.01.2013 22:33:11

Re: Как получить данные из REG_MULTY_SZ?

Сообщение Padre_Mortius » 09.03.2015 12:53:34

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
  Reg: TRegistry;
  DataType: cardinal;
  DataSize: cardinal;
  Res: integer;
  Str: string;
  i: integer;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if not Reg.OpenKeyReadOnly('Control Panel\Desktop\MuiCached') then
    begin
      ShowMessage('Can''t open key');
      Reg.CloseKey;
      Reg.Free;
      exit;
    end;
    DataSize := 0;
    Res := RegQueryValueEx(Reg.CurrentKey,                 // handle of key to query
                           'MachinePreferredUILanguages',  // address of name of value to query
                           nil,                            // reserved
                           @DataType,                      // address of buffer for value type
                           nil,                            // address of data buffer
                           @DataSize);                     // address of data buffer size
    if Res <> ERROR_SUCCESS then
    begin
      ShowMessage(SysErrorMessage(Res));
      Reg.CloseKey;
      Reg.Free;
      exit;
    end;
    if DataType <> REG_MULTI_SZ then
    begin
      ShowMessage('Wrong data type');
      Reg.CloseKey;
      Reg.Free;
      exit;
    end;
    SetLength(Str, DataSize - 1);
    if DataSize > 1 then
    begin
      Res := RegQueryValueEx(Reg.CurrentKey,
        // handle of key to query
        'MachinePreferredUILanguages',
        // address of name of value to query
        nil,                // reserved
        @DataType,          // address of buffer for value type
        PByte(Str),         // address of data buffer
        @DataSize);         // address of data buffer size
      if Res = ERROR_SUCCESS then
      begin
        for i := Length(Str) downto 1 do
          if Str[i] = #0 then
            Str[i] := #13;
        Memo1.Text := Str;
      end;
    end;
  finally
    Reg.Free;
  end;
end;

Как-то так
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 214

Рейтинг@Mail.ru
cron