• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
Delphi实现对注册表的监视和扫描
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
Delphi实现对注册表的监视和扫描
软件发布 Delphi实现对注册表的监视和扫描
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 文章首页 >> 编程技术 >> Delphi教程 >> Delphi实现对注册表的监视和扫描

Delphi实现对注册表的监视和扫描

添加时间: 2006-2-26 9:53:56  作者: Delphi教程  阅读次数:54   来源: http://www.d9soft.com

       

  Delphi自带的TRegistry类只能实现注册表的基本操作,如果我们要实时监视注册表的变化或者扫描注册表特定项下的所有子项,TRegistry类就无能为力了。我啃了半天SDK,终于实现了Delphi对注册表的监视与扫描,不敢独享,拿来献给广大的Delphi爱好者。

  监视注册表相关项的改变要用到一个API:RegNotifyChangeKeyValue。

  LONG RegNotifyChangeKeyValue(

  HKEY hKey, // 要监视的一个项的句柄
  BOOL bWatchSubtree, // 是否监视此项的子键 
  DWORD dwNotifyFilter, // 监视哪些变化
  HANDLE hEvent, // 接受注册表变化事件的事件对象句柄
  BOOL fAsynchronous // 注册表变化前报告还是注册表变化后才报告
  );

  注意上面的hEvent是接受注册表变化事件的事件对象句柄,我们要用API:CreateEvent来创建一个系统事件对象。

  HANDLE CreateEvent(

  LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES结构
  BOOL bManualReset, // 是否自动重置
  BOOL bInitialState, // 是否设置初始状态
  LPCTSTR lpName // 事件对象的名称
  );

  新建一个工程,添加一个ListBox,两个Button。

  //先写个监视注册表的例子
  //监视HKEY_CURRENT_USER\Software项下所有子键
  procedure TForm1.Button1Click(Sender: TObject);
  var
  hNotify : THandle;
  hKeyx : HKEY;
  dwRes : DWORD;
  begin
  hNotify := CreateEvent( nil, //不使用SECURITY_ATTRIBUTES结构
  FALSE, //不自动重置
  TRUE, //设置初始状态
  'RegistryNotify' //事件对象的名称
  );

  if hNotify = 0 then
  begin

  Showmessage('CreateEvent failed.');
  exit;
  end;

  if RegOpenKeyEx( HKEY_CURRENT_USER, //跟键
  'Software', //子键
  0, //reserved
  KEY_NOTIFY, //监视用
  hKeyx //保存句柄
  ) <> ERROR_SUCCESS then
  begin
  CloseHandle( hNotify );
  Showmessage('RegOpenKeyEx failed.');
  exit;
  end;

  if RegNotifyChangeKeyValue( hKeyx, //监视子键句柄
  TRUE, //监视此项的子键
  REG_NOTIFY_CHANGE_NAME or REG_NOTIFY_CHANGE_LAST_SET,
  hNotify, //接受注册表变化事件的事件对象句柄
  TRUE //注册表变化前报告
  ) <> ERROR_SUCCESS then
  begin
  CloseHandle( hNotify );
  RegCloseKey( hKeyx );
  Showmessage('RegNotifyChangeKeyValue failed');
  exit;
  end;

  dwRes := WaitForSingleObject( hNotify, 60 * 1000 ); //监视一分钟
  if dwRes = 0 then
  Showmessage( 'Registry will be changed.' );

  CloseHandle( hNotify );
  RegCloseKey( hKeyx );
  end;

  要注意的是,API: WaitForSingleObject要等到注册表变化事件发生或者超时才会返回,在此期间我们的程序将失去响应。解决的办法是新建一个线程,在新线程中监视注册表。

  对注册表进行扫描要用到另外两个API: RegEnumKey和RegEnumValue。

  LONG RegEnumKey(
  HKEY hKey, // 要扫描的注册表项目句柄
  DWORD dwIndex, // 要扫描的subkey序号
  LPTSTR lpName, // 要扫描的subkey名称

  LPDWORD lpcbName, // 要扫描的subkey名称占用空间
  );

  此函数的使用方法是: 首先给dwIndex赋值0, 调用RegEnumKey; 然后Inc(dwIndex), 再调用RegEnumKey,直到返回值为ERROR_NO_MORE_ITEMS,表示没有更多的子项了。

  //扫描注册表的例子
  //只演示了如何枚举HKEY_CURRENT_USER\Software下的一层子项
  procedure TForm1.Button2Click(Sender: TObject);
  var
  buf : array [0..255] of char;
  iRes : integer;
  hKeyx : HKEY;
  dwIndex, dwSize : DWORD;
  begin
  if RegOpenKeyEx( HKEY_CURRENT_USER, 'Software', 0, KEY_READ or
  KEY_ENUMERATE_SUB_KEYS, hKeyx ) <> ERROR_SUCCESS then
  begin
  Showmessage('RegOpenKeyEx failed.');
  exit;
  end;

  dwIndex := 0;
  repeat
  dwSize := 255;
  iRes := RegEnumKey( hKeyx, dwIndex, buf, dwSize );
  if iRes = ERROR_NO_MORE_ITEMS then
  break
  else if iRes = ERROR_SUCCESS then
  begin
  Listbox1.Items.Add( buf );
  Inc( dwIndex );
  end;
  until iRes <> ERROR_SUCCESS;

  RegCloseKey( hKeyx );
  end;

 

上下文章:

 

上一篇文章: Delphi 与FORTRAN语言的混合编程 下一篇文章: 基础实例:DELPHI8操作符重载

相关文章:

  • 飞速在线看视频 傲盾加速帮你实现速度感受
  • vista隐蔽的注册表垃圾清理方法
  • 用端口碰撞技术实现服务器远程管理
  • servlet实现oracle中读出文件并显示
  • 在Oracle中实现数据库的复制

相关软件:

  • Sundy注册表监控 V2.86 绿色版
  • SSPort高速端口扫描器 1.0
  • 域名注册搜索专家 2.5
  • 搜易邮件地址扫描器(EmailScanner) V3.5
  • NiceSPY系统监视专家 V3.0
  • MAC扫描器 V3.1

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • Delphi的两个实用技巧(1)播放Flash
  • Delphi的两个实用技巧(2)巧用Wind...
  • delphi实例编程之--制作可随处拖放...
  • 关于VisiBroker For Delphi的使用...
  • 关于VisiBroker For Delphi的使用...
  • 关于VisiBroker For Delphi的使用...
  • 在线播放器DIY
  • Delphi让你发送Flash电子邮件
  • 在窗口标题区添加按钮
  • 用Delphi 6编程实现自动标注汉语拼...

Delphi教程阅读排行

  • Delphi7从入门到精通之历数Delphi...
  • Delphi的两个实用技巧(1)播放Flash
  • Delphi7从入门到精通之认识Delphi...
  • delphi实例编程之--制作可随处拖放...
  • Delphi控件,我们也可以(1)
  • Delphi的两个实用技巧(2)巧用Wind...
  • 在线播放器DIY
  • Delphi控件,我们也可以(2)
  • Spcomm串口控件的例程
  • 用Delphi + DirectX开发简单RPG游...

编程技术阅读总排行

  • VB入门教程之一
  • Java连接数据库实例
  • 第二章 PowerBuilder 入门之创建新...
  • VC++之List Box/Check List Box控...
  • 第一章 什么是PowerBuilder
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有