急!读写注册表中的二进制数据!
我使用一些注册表修改工具,发现了一个有趣的现象,键名如下:
HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}
\ShellFolder,
该键下的Attributes为二进制值,默认为40 01 00 20,如果改为50 01 00 20,
则桌面回收站的右键菜单会增加一个“重命名”选项,并可以通过该命令进行
回收站改名。
我想用程序来完成它,这样读取该数据,不知道对不对:
uses registry;
Var
Buf : PInteger;
i : Integer;
const Key ='CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder';
begin
With TRegistry.Create do
begin
rootkey := hkey_classes_root;
OpenKey(Key,False);
i := readbinarydata('Attributes',Buf,sizeof(Buf);
closekey;
free;
showmessage(intttostr(integer(buf)));
showmessage(inttostr(i));
//究竟I是Attributes的数据还是Buf?
end;
end;
那么,如何使用WriteBinaryData将50 01 00 20 这样的二进制数据写入到注册表
中?另外,注册表中通过写入二进制数据可以保存图标、位图,如何知道该二进
制数据保存的是什么样的东东,用我以上读的方法肯定不行吧?
望各位高手赐教!
问题点数:50、回复次数:16Top
1 楼yeah()回复于 2000-10-20 16:49:00 得分 0
怎么没有回答呢:-(Top
2 楼Lionheart(狮心)回复于 2000-10-21 15:03:00 得分 10
我没试过,但我相信READBINARYDATA的返回值是BUF,函数返回值只是错误代号。
如你想保存图标等,你必须将文件中的数据读入一变量中,然后用WRITEBINARYDATA写入。
如,
v:=$50010020
WriteBinaryData('abc',v, sizeof(v)); Top
3 楼yeah()回复于 2000-10-21 21:33:00 得分 0
我的意思是,我对二进制数据不了解(我不知道二进制如何跟十进制进行换算,我以后再
买书学习,请现在先教我),在注册表中,我知道以上对“回收站”的用法,
但我不局限于“只知其然”的状态,我想进一步了解40 01 00 20及50 01 00 20包含的意思,(即它为什么不用Bool值来代替,当为0时(FALSE)时禁止,为1时允许)?即40 01 00 20代表什么意思,在高级语言中它应该翻译成怎样的含义?
LionHeart的语句是不是说:在表示二进制数据时,对50 01 00 20这样的数据可以在前面
加¥就可以了?那如果二进制数据更长一点呢?
各位大虾,问题初浅,望不吝指教!
(分不够可以再加),先谢谢了!
Top
4 楼zyb()回复于 2000-10-26 15:21:00 得分 20
二进制和十进制的区别是:
二进制只有0和1,一个字节为8位,即十进制的1用而进制来表示为00000001
换算方法为:用十进制数除以2,余数为二进制数的最低位,再用商除以2,余数为二进制数的次低位,。。。依此类推,直到商为1为止,则最后的商即为二进制数的最高位。Top
5 楼liangma(昆仑踏月)回复于 2000-10-26 19:47:00 得分 10
你的buf只是一个指针,你并为为它分配内在空间,请将buf定义为integer,同时如果readbinarydata执行成功的话,它将返回ATTRIBUTES的长整数。
在注册表中所指的二进制数,是指指定属性值的存储形式,它在注册表文件中仍然以数值形式存储,而不是序列。Top
6 楼liangma(昆仑踏月)回复于 2000-10-26 19:53:00 得分 0
你的buf只是一个指针,你并为为它分配内在空间,请将buf定义为integer,同时如果readbinarydata执行成功的话,它将返回ATTRIBUTES的长整数,与BUF中的相同。
在注册表中所指的二进制数,是指指定属性值的存储形式,它在注册表文件中仍然以数值形式存储,而不是序列。Top
7 楼Tod(菜鸟)回复于 2000-10-27 12:06:00 得分 10
按以下方式即可读写二进制数据,不过在括号里的是16进制的数据,你把在注册表编辑器里看到的十进制数据转换成16进制的在按以下的方法即可。
var array [0..3]of byte=(50,01,00,32);
……
reg.WriteBinaryData('Attributes',trash,sizeof(trash));
……
嘿嘿,别忘了给分啊!Top
8 楼yeah()回复于 2000-10-28 23:54:00 得分 0
感谢各位的答复,看看还有没有谁补充,如果没有,我就给分啦。Top
9 楼wr960204(武稀松)回复于 2000-10-29 13:43:00 得分 0
不必在乎几进制,用readinteger和writeinteger就行了Top
10 楼Tod(菜鸟)回复于 2000-10-29 14:43:00 得分 0
有补充,那就是如果如果手工进行十进制与十六进制转换麻烦,别忘了用计算器,呵呵!Top
11 楼Tod(菜鸟)回复于 2000-10-30 09:51:00 得分 0
老兄,问题解决了别忘了给分啊,我等着你给分呢,我还没得过“专家分”呢,所以一定要开开张啊,呵呵!Top
12 楼dchengwang(开发者)回复于 2001-08-03 16:36:45 得分 0
1Top




