我使用此代碼從註冊表中讀取二進制數據爲字符串讀REG_BINARY爲String
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字符,因爲我在Value之前寫了一個長文本(帶有CR/LF的字符串)。
如果你在'Data:= String(Buffer)'賦值處設置了一個調試斷點,並看看'Buffer',那麼它究竟是什麼? – 2012-08-13 11:00:55
看起來像我甚至無法訪問它。但我認爲它的#0。如果我嘗試這樣的事情,我會得到很多訪問衝突:if buffer [0] =''then messagebox(0,'ERROR','',0); – 2012-08-13 11:09:20
編輯:我得到000000 messagebox(0,pchar(格式('%8p',[@buffer [0]])),'',0); – 2012-08-13 11:24:57