【发布时间】:2012-08-13 09:34:21
【问题描述】:
我使用此代码将二进制数据从注册表读取到字符串
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 字符,因为我之前在 Value 中写了一个长文本(带有 CR/LF 的字符串)。
【问题讨论】:
-
如果您在
Data := String(Buffer)赋值上设置了一个调试断点,然后查看Buffer,它实际上是什么? -
看起来我什至无法访问它。但我认为它的#0。如果我尝试这样的事情,我会遇到很多访问冲突: if buffer[0] = '' then messagebox (0, 'ERROR', '', 0);
-
编辑:我得到 000000 消息框 (0, pchar(Format('%8p', [@buffer[0]])), '', 0);
标签: winapi registry delphi-7 delphi