String 如何使用Delphi和writebinary命令将二进制值的字符串格式写入注册表?
出于某种原因,我需要将二进制值的字符串格式写入二进制注册表项,换句话说,我有一个如下的注册表值:String 如何使用Delphi和writebinary命令将二进制值的字符串格式写入注册表?,string,delphi,binary,registry,String,Delphi,Binary,Registry,出于某种原因,我需要将二进制值的字符串格式写入二进制注册表项,换句话说,我有一个如下的注册表值: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Sonal] "Password"=hex:00,d6 我尝试使用以下代码将其写入注册表: procedure Tesct.Button2Click(Sender: TObject); var RegInfoExists : TRegistry; EdStr
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Sonal]
"Password"=hex:00,d6
我尝试使用以下代码将其写入注册表:
procedure Tesct.Button2Click(Sender: TObject);
var
RegInfoExists : TRegistry;
EdStr : AnsiString;
begin
try
RegInfoExists := TRegistry.Create(KEY_WRITE OR KEY_WOW64_64KEY);
RegInfoExists.RootKey := HKEY_LOCAL_MACHINE;
if RegInfoExists.OpenKey('SOFTWARE\Sonal',true) then
EdStr := #$00#$d6;
RegInfoExists.WriteBinaryData('Password', EdStr,
Length(EdStr) * SizeOf(byte));
except
end;
RegInfoExists.CloseKey;
RegInfoExists.Free;
end;
我得到了这个:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Sonal]
"Password"=hex:dc,d7
如何执行此操作?您正在写入
字符串的值,该变量是字符串的地址。这是因为在实现级别,字符串只是指针
相反,您需要取消引用指针。有两种常用的方法可以做到这一点:
RegInfoExists.WriteBinaryData('Password', EdStr[1],
Length(EdStr)*SizeOf(AnsiChar));
或
如果您真的只是想写这两个字节,那么就更容易了,如下所示:
const
Password: array [0..1] of byte = ($00, $d6);
....
RegInfoExists.WriteBinaryData('Password', Password, Length(Password));
我还要指出,你在管理资源方面应该非常严格和精确。这意味着正确使用try/finally
。像这样:
SomeInstance := TSomeClass.Create;
try
.... do stuff with SomeInstance
finally
SomeInstance.Free;
end;
而且您似乎还忽略了if
语句后面的代码所需的begin
/end
。您正在编写string
变量的值,该变量是字符串的地址。这是因为在实现级别,字符串只是指针
相反,您需要取消引用指针。有两种常用的方法可以做到这一点:
RegInfoExists.WriteBinaryData('Password', EdStr[1],
Length(EdStr)*SizeOf(AnsiChar));
或
如果您真的只是想写这两个字节,那么就更容易了,如下所示:
const
Password: array [0..1] of byte = ($00, $d6);
....
RegInfoExists.WriteBinaryData('Password', Password, Length(Password));
我还要指出,你在管理资源方面应该非常严格和精确。这意味着正确使用try/finally
。像这样:
SomeInstance := TSomeClass.Create;
try
.... do stuff with SomeInstance
finally
SomeInstance.Free;
end;
而且您似乎还省略了if
语句后面的代码所需的begin
/end
。此外还有一个begin。。。结束
可能有用。谢谢您的时间,是的,我忘了开始。。。。结束。不,它不仅仅是2字节。是的,我应该更加注意资源。非常感谢你,大卫。另外一个开始。。。结束
可能有用。谢谢您的时间,是的,我忘了开始。。。。结束。不,它不仅仅是2字节。是的,我应该更加注意资源。大卫,非常感谢你