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的字符串).
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完成了这项工作.
| 归档时间: |
|
| 查看次数: |
1963 次 |
| 最近记录: |