Как я могу удаленно читать двоичные данные реестра, используя Delphi 2010? - PullRequest
0 голосов
/ 12 октября 2010

Я пытаюсь удаленно прочитать двоичное (REG_BINARY) значение реестра, но не получаю ничего, кроме мусора. Есть идеи, что не так с этим кодом? Я использую Delphi 2010:

function GetBinaryRegistryData(ARootKey: HKEY; AKey, AValue, sMachine: string; var sResult: string): boolean;
    var
      MyReg: TRegistry;
      RegDataType: TRegDataType;
      DataSize, Len: integer;
      sBinData: string;
      bResult: Boolean;
    begin
      bResult := False;
      MyReg := TRegistry.Create(KEY_QUERY_VALUE);

      try
        MyReg.RootKey := ARootKey;
        if MyReg.RegistryConnect('\\' + sMachine) then
        begin
          if MyReg.KeyExists(AKey) then
          begin
            if MyReg.OpenKeyReadOnly(AKey) then
            begin
              try
                RegDataType := MyReg.GetDataType(AValue);
                if RegDataType = rdBinary then
                begin
                  DataSize := MyReg.GetDataSize(AValue);
                  if DataSize > 0 then
                  begin
                    SetLength(sBinData, DataSize);
                    Len := MyReg.ReadBinaryData(AValue, PChar(sBinData)^, DataSize);
                    if Len <> DataSize then
                      raise Exception.Create(SysErrorMessage(ERROR_CANTREAD))
                    else
                    begin
                      sResult := sBinData;
                      bResult := True;
                    end;
                  end;
                end;
              except
                MyReg.CloseKey;
              end;
              MyReg.CloseKey;
            end;
          end;
        end;
      finally
        MyReg.Free;
      end;

      Result := bResult;
    end;

И я называю это так:

GetBinaryRegistryData(
   HKEY_LOCAL_MACHINE, 
   '\SOFTWARE\Microsoft\Windows NT\CurrentVersion', 
   'DigitalProductId', '192.168.100.105', 
   sProductId
);

WriteLn(sProductId);

Результат, который я получаю от WriteLn на консоли:

ñ ♥ ???????????6Z ????1   ???????☺  ???♦            ??3   ? ??? ?
??

Ответы [ 2 ]

5 голосов
/ 12 октября 2010

Если вы уже подключены удаленно, попробуйте использовать функцию GetDataAsString читать двоичные данные из реестра.

sResult := MyReg.GetDataAsString(AValue);
5 голосов
/ 12 октября 2010

Вы используете Delphi 2010, поэтому все ваши символы имеют ширину два байта. Когда вы устанавливаете длину вашей строки результатов, вы выделяете в два раза необходимое количество места. Затем вы вызываете ReadBinaryData, и он заполняет half ваш буфер. В каждом символе есть два байта данных. Посмотрите на каждый байт отдельно, и вы, вероятно, обнаружите, что ваши данные выглядят менее похожими на мусор.

Не используйте строки для хранения произвольных данных. Используйте строки для хранения текста. Для хранения произвольных BLOB-объектов данных используйте TBytes, который представляет собой массив байтов.

...