2010-02-10 130 views
2

我需要转换字符串以将其写入registry.reg_binary项。Delphi - 将字符串写入Reg_Binary注册表项

我有基本码写入到密钥如下:

try 
    rootkey := HKEY_CURRENT_USER; 
    if OpenKey(Key, False) then 
    begin 
     reg.WriteBinaryData('SomeKey', SomeValue, Length(SomeVale)); 
     CloseKey; 
    end; 
finally 
    reg.Free; 
end; 

在上文中,someValue中需要是TEDIT文本字段的十六进制值;

我现在正在使用IntToHex在每个字符的Ord值上转换TEdit.text。这给了我授予此假定您的字符串只包含ANSI数据, 但如果你想看起来像什么,我想写一个字符串...

在这一点上我很为难......

回答

2

写一个字符串到注册表值作为二进制值,那么你的逻辑如下更改将工作:

var 
    EdStr : AnsiString; 
: 
    EdStr := AnsiString(Edit1.Text); // de-unicode 
    reg.WriteBinaryData('SomeKey', EdStr[1], Length(EdStr)); 
+0

感谢您的支持 - 我仍然需要使用#00填充字符串以获取接收应用程序所需的格式,但是这样做很厉害! – 2010-02-11 10:19:05

6

如果你想要写一个字符串,那么你应该叫WriteString

reg.WriteString('SomeKey', SomeValue); 

如果您有整数,请致电WriteInteger

IntValue := StrToInt(SomeValue); 
reg.WriteInteger('SomeKey', IntValue); 

如果你有真正的二进制数据,那么它不应该的问题是什么样子 - 十六进制或什么的。致电WriteBinaryData并完成它。数据的实际外观并不重要,因为您不必以此格式阅读它。稍后您将使用ReadBinaryData来阅读它,并且它将填充您的缓冲区,其中包含您在写入时所用的任何格式的字节。

IntValue := StrToInt(SomeValue); 
reg.WriteBinaryValue('SomeKey', IntValue, SizeOf(IntValue)); 

这会将整数的所有四个字节写入注册表中作为二进制值。

当Windows注册表编辑器向您显示密钥的值时,它可能会以十六进制显示每个字节,但这只是显示格式。这并不意味着您必须在将数据添加到注册表之前将其数据格式化。

+0

不幸的是并非如此。更改我的代码以使用WriteString将注册表中的项更改为接收应用程序无法写入的REG_SZ项。 RegEdit将REG_SZ键显示为纯文本,而不是查看其他程序输入的详细信息时看到的十六进制值。 真正文本值的StrToInt当然会炸掉 – 2010-02-11 10:08:44