我使用此代码将二进制数据从注册表读取到字符串
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:
它可以很好地处理固定声明的字节/字符数组
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的字符串)。
发布于 2012-08-13 19:31:35
Buffer: array of char;是动态的字符数组,也就是实际上的指针变量。此字符串将指针重置为Nil:
FillChar(Buffer, SizeOf (Buffer), #0);所以现在动态数组无效。
要用零填充动态数组的内容,必须使用
FillChar(Buffer[0], SizeOf(Buffer[0]) * Length(Buffer), #0)但这并不是必需的,因为SetLength可以完成这项工作。
发布于 2012-08-13 19:50:30
https://stackoverflow.com/questions/11931573
复制相似问题