Страницы

Поиск по вопросам

вторник, 13 ноября 2018 г.

Запись бинарных данных в реестр

Пытаюсь изменить значение реестра типа reg_binary
type TBuffer = array[0..11] of byte; const InputData:TBuffer=($07,$00,$00,$00,$6F,$2B,$15,$00,$40,$AB,$D3,$01); var Reg: TRegistry; InputBuffer: TBuffer; begin InputBuffer := InputData;
Reg := TRegistry.Create(); try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey('....', True) then begin Reg.WriteBinaryData('Health',InputBuffer, SizeOf(InputBuffer));//пробовал и InputBuffer[0] Reg.CloseKey; end; finally Reg.Free; end;
Пробовал и так :
var Data: array of Byte;
....
SetLength(Data, 12); Data[0] := $07; Data[1] := $00; Data[2] := $00; Data[3] := $00; Data[4] := $6F; Data[5] := $2B; Data[6] := $15; Data[7] := $00; Data[8] := $40; Data[9] := $AB; Data[10] := $D3; Data[11] := $01;
Reg := TRegistry.Create(KEY_SET_VALUE); try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey('....', True) then begin Reg.WriteBinaryData('Health',Data, 12); //пробовал и Data[0] Reg.CloseKey; end; finally Reg.Free; end; end;
Но изменений никаких нет, написал подобное на c#
RegistryKey currentUserKey = Registry.LocalMachine; RegistryKey helloKey = currentUserKey.OpenSubKey(@"...", true); helloKey.SetValue("Health", new byte[] { 07, 00, 00, 00, 0x6F, 0x2B, 15, 00, 40, 0xAB, 0xD3, 01, }); helloKey.Close();
и значение изменилось. Где я в delphi ошибся ?
п.с от админа запускаю


Ответ

В 64-х битной Windows для 32-х битных приложений есть т.н. виртуализация, из-за которой эти приложения видят свою, 32-х битную версию реестра (Alternate Registry View).
Для того, чтобы 32-х битное приложение смогло увидеть системную 64-х битную версию реестра, надо использовать флаг KEY_WOW64_64KEY (0x0100)
KEY_WOW64_64KEY Indicates that an application on 64-bit Windows should operate on the 64-bit registry view. This flag is ignored by 32-bit Windows. This flag must be combined using the OR operator with the other flags in this table that either query or access registry values.
То есть, нужно делать так:
Reg := TRegistry.Create(KEY_WRITE OR KEY_WOW64_64KEY); try ... finally ... end;

Комментариев нет:

Отправить комментарий