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字节。是的,我应该更加注意资源。大卫,非常感谢你