监视程序的编制

原创 2001年05月04日 22:09:00

      视程序,这个名字听起来似乎很陌生。它的用途主要是在后台监视系统中关键信息的改变,比如注册表的改变及硬盘上由于文件操作引起的改变等等。

  也许有人会问了,编制这样的程序有什么价值呢?硬盘上文件改变了,我只要在资源管理器里点一点不就全都清楚了吗?问题当然不会这样简单,如今大家的硬盘都已经用G来做单位了,一块4.3G的硬盘中,大大小小的文件全都加起来也会有若干万(相信新购机的朋友会考虑IBM10.1G的大硬盘,那文件数量将更加不可想象),更何况那些看不见的系统文件和隐藏文件了。再加上注册表,那其中的条条款款,数量也丝毫不逊于硬盘上的文件。要想随时知道自己机器是否有所变动,绝对不是一件很轻松的事。而监视程序就可以随时检测到这些变化,帮助我们了解这些情况。

  当然这只是监视程序的一部分作用,它最大的作用就是可以记录下某个软件安装前后系统的改变,从而为卸载这个软件提供重要的依据。虽然Windows自带了一个Uninstall Shield,但是它似乎并不能很干净地把原来的软件卸掉,每次卸载总会留下一些讨厌的残渣,致使系统中的垃圾信息不断增长,我们的硬盘空间也总是莫名其妙地越用越少。因此,一些号称能够完全卸载软件的专用卸载工具应运而生。在这其中,有一些就运用了监视系统的技术,比如Uninstaller Manager和RegMonitor。

  下面我们开始讨论如何编程实现这一监视功能。首先介绍几个重要的api函数:

  FindFirstChangeNotification( );

  FindNextChangeNotification( );

  WaitForSingleObject( );

  其中FindFirstChangeNotification(lpzpath,fwatchsubtree,fdwfilter)中的lpzpath表示要监视的路径名,fwatchsubtree判断是否查看子目录,fdwfilter为要监视的事件,函数执行成功后返回一个句柄。

  参数fdwfilter取值及其含义如下:

  FILE_NOTIFY_CHANGE_FILE_NAME  查看指定目录下任何文件名的改变

  FILE_NOTIFY_CHANGE_DIR_NAME  查看指定目录下任何目录名的改变

  FILE_NOTIFY_CHANGE_SIZE  查看指定目录下文件大小的改变

  FILE_NOTIFY_CHANGE_ATTRIBUTES  查看指定目录下文件属性的改变

  FindNextChangeNotification(hchange),hchange为FindFirstChangenNotification返回的句柄,其作用是请求系统 在下次检测到相应改变时发出改变通知消息句柄。

..当函数成功返回后,应用程序可通过WaitForMultipleObjects或WaitfForSingleObject来等待发生改变的通知。WaitForSingleObject(hchange,dwmilliseconds)中hchange为FindFirstChangeNotification 返回的句柄,dwmilliseconds为等待时间值,指定等待完成需要的时间,单位为毫秒。该值为-1时表示时间无限长。最好在结束监视程序之前先用FindCloseChangeNotification(hchange)来关闭句柄。   下面给出一个简单的实例,其功能就是监视c:/pwin98目录下是否有文件发生变化。一旦有重命名、创建或删除情况发生时,通过Edit控件给出提示。

  #include

  #pragma hdrstop

     #include “Unit1.h”

  //----------------

  #pragma package(smart_init)

  #pragma resource “*.dfm”

  TForm1 *Form1;   //-----------------

  __fastcall TForm1::TForm1(TComponent* Owner)    : TForm(Owner)   {   }   //-------------------      void __fastcall TForm1::FormCreate(TObject *Sender)

  {

  DWORD dwWaitStatus;

  HANDLE dwChangeHandle;//返回通知的句柄

  dwChangeHandle=FindFirstChangeNotification(   “C://PWIN98”,false,FILE_NOTIFY_CHANGE_FILE_NAME); //设置返回通知的句柄   if(dwChangeHandle==INVALID_HANDLE_VALUE)   //判断是否设置成功

   ExitProcess(GetLastError( ));

  while(true){ //设置循环,监视是否有

  dwWaitStatus=WaitForSingleObject(dwChangeHandle,-1); //通知返回

  switch(dwWaitStatus)

{

  case 0:   Edit1->Text=“Something Changed”; //给出提示

  FindCloseChangeNotification(dwcChangeHandle); //关闭句柄

  exit(EXIT_SUCCESS); //退出程序

  default:   ExitProcess(GetLastError( ));

  }

  }

  }

  程序在C++Builder4/PWin98下通过,由于C++Builder语言很标准,所以很容易扩展到其他编程语言环境中去。   此例说明如何监视硬盘中文件变化,对于注册表,则有函数RegNotifyChangeKeyValue( )可以实现类似功能,这里暂省略之。   怎么样,看过本文,是否对Uninstaller Manager和Reg Monitor这样的软件有了更深入的了解。在Windows编程中,有些API函数起到了重要的作用,可以让程序实现很多高级的功能。因为API函数是按照C语言语法给出的,所以C++Builder有着得天独厚的优势,对API函数和宏支持得非常好。不好,怎么跑题了?   还愣着干吗,难道你还不想赶快动手编制一个自己的Uninstaller Manager吗?

监视程序的编制

  • zgqtxwd
  • zgqtxwd
  • 2008年04月27日 15:41
  • 150

监视程序的编制

2000年08月21日 20:17:00 监视程序的编制 (哈尔滨 赵晓辉)  监视程序,这个名字听起来似乎很陌生。它的用途主要是在后台监视系统中关键信息的改变,比如注册表的改变及硬盘上由于文...
  • softart
  • softart
  • 2007年10月27日 06:55
  • 243

VC-监视程序的编制

监视程序,这个名字听起来似乎很陌生。它的用途主要是在后台监视系统中关键信息的改变,比如注册表的改变及硬盘上由于文件操作引起的改变等等。 也许有人会问了,编制这样的程序有什么价值呢?硬盘上文件改变了,...
  • ccx_john
  • ccx_john
  • 2013年10月08日 09:53
  • 536

监视API调用的一个小程序

工作一段时间了,我喜欢工作,但是,工作确实很累,压里很大~所以我就得每天好好的学习,抓进一切时间学习,于是,我就APIHOOK这个主题进行了一番演练:监视API调用的一个小程序,原理是根据远程进程的导...
  • aspbasicer
  • aspbasicer
  • 2005年07月28日 01:29
  • 3361

转:Directshow开发的一些例子

DirectShow Filter 开发典型例子分析 ——字幕叠加 (FilterTitleOverlay)1 本文分析一下《DirectShow开发指南》中的一个典型的Transform Fi...
  • xiaojun111111
  • xiaojun111111
  • 2016年08月09日 11:32
  • 529

打印程序的编制

导读:   MFC在实现打印编程工作时已经建立了一个已有的框架,我们只要往这个框架里面填东西即可。   打印工作其实就是在DC上绘图,不过这里的DC是打印机的DC,明确这一点之后,想当然的,我们打印的...
  • zlf0727
  • zlf0727
  • 2007年11月30日 12:31
  • 479

实验六 共享存储区通信

 实验六  共享存储区通信实验目的了解和熟悉共享存储机制实验内容编制一长度为1k的共享存储区发送和接收的程序。实验指导一、共享存储区1、共享存储区机制的概念共享存储区(Share  Memory)是U...
  • Non_Recursive
  • Non_Recursive
  • 2009年04月11日 19:47
  • 4763

剪贴板监控--C++实现

给大家两个消息,happy的去玩吧:WM_CHANGECBCHAIN 和 WM_DRAWCLIPBOARD。。 原理:剪贴板有一个监控链表,这个链表中就是监控了剪贴板的程序,如果有新的监控程序加入或...
  • keep_moving_cqu
  • keep_moving_cqu
  • 2013年08月19日 11:05
  • 1700

在C#中监视剪贴板的变化

http://www.developer.com/net/csharp/article.php/3359891#overview
  • changhu
  • changhu
  • 2011年02月20日 17:23
  • 441

进程监控程序的开发(程序运行监控)

很多应用程序是需要7*24小时运行的,不知道那个家伙不小心就把你要定时执行的程序关闭了,而且你是运行在右下角任务栏的,不注意根本就不知道被关闭。我写了一个程序实现hqms接口,就是要定时完成推送数据的...
  • panliuwen
  • panliuwen
  • 2015年09月23日 00:37
  • 1185
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:监视程序的编制
举报原因:
原因补充:

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