将REG_BINARY读取为String

Ben*_*iss 2 delphi registry winapi delphi-7

我使用此代码将二进制数据从注册表读取到字符串

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, SizeOf (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;
Run Code Online (Sandbox Code Playgroud)

EDIT2:

它使用固定的byte/char声明数组工作正常

function ReadBinary (RootKey: HKEY; SubKey,ValueName: WideString; var Data : String): Bool;
var
  Key     : HKey;
  Buffer  : array [0..200] 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
      FillChar(Buffer, SizeOf (Buffer), #0);
      if RegQueryValueExW(Key,pwidechar(ValueName),NIL,@RegType, @Buffer,@Size) = ERROR_SUCCESS then begin
        result := TRUE;
        Data   := String (Buffer);
      end;
    end;        
  end;
  RegCloseKey (Key);
end;
Run Code Online (Sandbox Code Playgroud)

我被卡住了.我做错了什么,解决方案是什么?

谢谢您的帮助.

编辑:

我知道我正在从注册表中读取二进制数据.因此它可能已经0终止并且可以返回错误结果.我可以保证二进制数据中没有#0字符,因为我在Value之前写了一个长文本(带有CR/LF的字符串).

MBo*_*MBo 6

Buffer: array of char;
Run Code Online (Sandbox Code Playgroud)

是动态的字符数组,实际上是指针变量.此字符串将指针重置为Nil:

   FillChar(Buffer, SizeOf (Buffer), #0);
Run Code Online (Sandbox Code Playgroud)

所以动态数组现在无效.

要用零填充动态数组的内容,必须使用

    FillChar(Buffer[0], SizeOf(Buffer[0]) * Length(Buffer), #0)
Run Code Online (Sandbox Code Playgroud)

但这不是必要的,因为SetLength完成了这项工作.