代码之家  ›  专栏  ›  技术社区  ›  Mick

如何使用Delphi2010远程读取二进制注册表数据?

  •  0
  • Mick  · 技术社区  · 16 年前

    我正在尝试远程读取二进制(reg_binary)注册表值,但除了垃圾,我什么也没有得到。知道这个代码有什么问题吗?我用的是Delphi2010:

    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 回复  |  直到 16 年前
        1
  •  5
  •   RRUZ    16 年前

    假设您已经远程连接,请尝试使用 GetDataAsString 功能 从注册表中读取二进制数据。

    sResult := MyReg.GetDataAsString(AValue);
    
        2
  •  5
  •   Rob Kennedy    16 年前

    您使用的是Delphi2010,所以所有字符都是两个字节宽的。当您设置结果字符串的长度时,您正在分配 两次 您需要的空间量。然后你打电话 ReadBinaryData 它充满 一半 你的缓冲区。每个字符有两个字节的数据。分别查看每个字节,您可能会发现您的数据看起来不像垃圾。

    不要使用字符串存储任意数据。使用字符串存储文本。要存储任意数据块,请使用 TBytes ,这是一个字节数组。