CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

急!读写注册表中的二进制数据!

楼主yeah()2000-10-19 02:12:00 在 Delphi / VCL组件开发及应用 提问

我使用一些注册表修改工具,发现了一个有趣的现象,键名如下:  
  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

相关问题

  • 如何在注册表里面写入二进制数据
  • 关于注册表中二进制数据的读出写入问题?
  • 如何向注册表读写超过1M的大型二进制数据
  • 急,二进制数据问题
  • 请求帮助,注册表中的二进制数据怎样读?读出后怎样转换成十进制?
  • 请问在C++Builder里利用TRegistry类对注册表里二进制数据的读写方法是什么?怎么用?
  • 请问在C++Builder里利用TRegistry类的WriteBinaryData方法在注册表里添加二进制数据:as=50,01,00,20怎么做
  • socket(套接字)怎么传输二进制数据?急
  • 急!请教delphi中二进制数据的问题
  • 急:存储大型二进制的数据类型是什么?

关键词

  • 二进制
  • 数据
  • 文件
  • 注册表
  • 十进制
  • readbinarydata
  • writebinarydata
  • 回收站
  • buf
  • 值

得分解答快速导航

  • 帖主:yeah
  • Lionheart
  • zyb
  • liangma
  • Tod

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo