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

原创 2004年03月05日 13:41:00

声明:CSDN以外的任合团体和个人转载本文必须注明出处和作者。

    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;

 

VC++实现注册表监控

//监视HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run项 #include //定义一个监视注册表启动项的函数 ...
  • yincheng01
  • yincheng01
  • 2012年10月24日 15:22
  • 3929

delphi 遍历注册表

下面程序是读出windows中所有的已安装的程序.你自己看一下,很容易的.      uses   Registry;           procedure   TForm1.Button1C...
  • lw001x
  • lw001x
  • 2012年06月19日 22:45
  • 1801

C# 利用WMI进行注册表监视

VERSION 5.00Begin VB.Form frmMain    Caption         =   "Form1"   ClientHeight    =   3090   Client...
  • chenhui530
  • chenhui530
  • 2007年10月03日 11:20
  • 2446

注册表监视的4种方式

注册表监视,总结说来,可行的方法有以下四种,有其他做法,欢迎指出: 1.使用RegNotifyChangeKeyValue 这个函数可以监视注册表某一项及其子项的变化(包括添加、删除、修改...
  • yupei881027
  • yupei881027
  • 2014年06月08日 07:51
  • 592

反病毒工具之注册表监视器

本程序实现了ring3下的注册表监管工作.由VB+VC实现.功能和瑞星的注册表监视非常类似,如下图:目前只监视了启动项.VC DLL下载地址是:http://p.blog.csdn.net/image...
  • chenhui530
  • chenhui530
  • 2008年01月31日 23:19
  • 9590

在Delphi中轻松操作注册表TRegistry类

在Delphi中轻松操作注册表TRegistry类在应用程序中,经常需要对注册表进行各种操作,如将程序名称、安装路径等信息保存到注册表中。Delphi对相应API函数做了进一步封装,使得在应用程序中操...
  • Tercel99
  • Tercel99
  • 2006年05月18日 21:17
  • 7905

Delphi在win7/vista下写注册表等需要管理员权限的解决方案

注:本文系转载。        看到论坛好多人问win7下写注册表的问题,我结合自己的理解写了一点东西,首先声明一下,本人初学Delphi,水平有限,大家见笑了,有什么不对之处请老鸟多指点。 ...
  • fghydx
  • fghydx
  • 2014年06月27日 09:27
  • 1729

在Delphi中操作注册表的方法

Delphi提供了TRegistry类,它直接继承自TObject类,主要属性有:RootKey等,主要方法有:Create,CreateKey(Key),   Ope...
  • shao882
  • shao882
  • 2015年03月01日 16:55
  • 1444

软件安装注册表监视:Total Uninstall

你是否经常从网上下载、安装、试用各种各样的软件?在安装这些软件的时候,就会对系统文件、注册表进行更改,但究竟改变了哪些文件?更改了哪些注册表键值呢?这些我们往往不得而知。而在卸载软件的时候,我们一般会...
  • caiqi1123
  • caiqi1123
  • 2011年11月15日 09:55
  • 1333

监视进程函数(API扫描进程映射表)

int MyWatch(char * thread_name) { PROCESSENTRY32 pe32; char * mychar; BOOL bstart=TRUE; ...
  • tiger9991
  • tiger9991
  • 2012年09月19日 23:22
  • 1247
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi实现对注册表的监视和扫描
举报原因:
原因补充:

(最多只允许输入30个字)