整理日:2015/3/25编程
监视程序, 这个名字听起来彷佛很陌生. 它的用途主要是在后台监视系统中关键信息的改变, 好比注册表的改变及硬盘上因为文件操做引发的改变等等.api
也许有人会问了, 编制这样的程序有什么价值呢? 硬盘上文件改变了, 我只要在资源管理器里点一点不就全都清楚了吗? 问题固然不会这样简单, 现在你们的硬盘都已经用G来作单位了, 一块4.3G的硬盘中, 大大小小的文件全都加起来也会有若干万(相信新购机的朋友会考虑IBM10.1G的大硬盘, 那文件数量将更加不可想象), 更况且那些看不见的系统文件和隐藏文件了. 再加上注册表, 那其中的条条款款, 数量也丝绝不逊于硬盘上的文件. 要想随时知道本身机器是否有所变更, 绝对不是一件很轻松的事. 而监视程序就能够随时检测到这些变化, 帮助咱们了解这些状况.编程语言
固然这只是监视程序的一部分做用, 它最大的做用就是能够记录下某个软件安装先后系统的改变, 从而为卸载这个软件提供重要的依据. 虽然Windows自带了一个Uninstall Shield, 可是它彷佛并不能很干净地把原来的软件卸掉, 每次卸载总会留下一些讨厌的残渣, 导致系统中的垃圾信息不断增加, 咱们的硬盘空间也老是莫名其妙地越用越少. 所以, 一些号称可以彻底卸载软件的专用卸载工具应运而生. 在这其中, 有一些就运用了监视系统的技术, 好比Uninstaller Manager和RegMonitor.函数
下面咱们开始讨论如何编程实现这一监视功能. 首先介绍几个重要的api函数:工具
FindFirstChangeNotification(); FindNextChangeNotification(); WaitForSingleObject(); FindCloseChangeNotification();
FindFirstChangeNotification
其中FindFirstChangeNotification(lpzpath, fwatchsubtree, fdwfilter)中的lpzpath表示要监视的路径名, fwatchsubtree判断是否查看子目录, fdwfilter为要监视的事件, 函数执行成功后返回一个句柄.ui
参数fdwfilter取值及其含义以下:code
参数值 | 含义 |
---|---|
FILE_NOTIFY_CHANGE_FILE_NAME | 查看指定目录下任何文件名的改变 |
FILE_NOTIFY_CHANGE_DIR_NAME | 查看指定目录下任何目录名的改变 |
FILE_NOTIFY_CHANGE_SIZE | 查看指定目录下文件大小的改变 |
FILE_NOTIFY_CHANGE_ATTRIBUTES | 查看指定目录下文件属性的改变 |
FindNextChangeNotification
FindNextChangeNotification(hchange), hchange为FindFirstChangenNotification返回的句柄, 其做用是请求系统在下次检测到相应改变时发出改变通知消息句柄. 当函数成功返回后, 应用程序可经过WaitForMultipleObjects或WaitfForSingleObject来等待发生改变的通知.component
WaitForSingleObject
WaitForSingleObject(hchange, dwmilliseconds)中hchange为FindFirstChangeNotification 返回的句柄, dwmilliseconds为等待时间值, 指定等待完成须要的时间, 单位为毫秒. 该值为-1时表示时间无限长.orm
FindCloseChangeNotification
最好在结束监视程序以前先用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吗?