我使用此代码将二进制数据从注册表读取到字符串
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;
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;
我被困住了。 我做错了什么,解决方案是什么?
感谢您的帮助。
编辑:
我知道我正在从注册表中读取二进制数据。因此它可能已经0终止并且可以返回错误结果。我可以保证二进制数据中没有#0字符,因为我在之前的值中写了一个长文本(带有CR / LF的字符串)。
答案 0 :(得分:6)
Buffer: array of char;
是chars的动态数组,实际上是指针变量。此字符串将指针重置为Nil:
FillChar(Buffer, SizeOf (Buffer), #0);
所以动态数组现在无效。
要用零填充动态数组的内容,必须使用
FillChar(Buffer[0], SizeOf(Buffer[0]) * Length(Buffer), #0)
但这不是必需的,因为SetLength完成了这项工作。
答案 1 :(得分:0)