副标题#e#
监督措施,这个名字听起来好像很生疏。它的用途主要是在靠山监督系统中要害信息的改变,好比注册表的改变及硬盘上由于文件操纵引起的改变等等。
也许有人会问了,体例这样的措施有什么代价呢?硬盘上文件改变了,我只要在资源打点器里点一点不就全都清楚了吗?问题虽然不会这样简朴,如今各人的硬盘都已经用G来做单元了,一块4.3G的硬盘中,大巨细小的文件全都加起来也会有若干万(相信新购机的伴侣会思量IBM10.1G的大硬盘,那文件数量将越发不行想象),更况且那些看不见的系统文件和埋没文件了。再加上注册表,谁人中的条条款款,数量也丝绝不逊于硬盘上的文件。要想随时知道本身呆板是否有所变换,绝对不是一件很轻松的事。而监督措施就可以随时检测到这些变革,辅佐我们相识这些环境。
虽然这只是监督措施的一部门浸染,它最大的浸染就是可以记录下某个软件安装前后系统的改变,从而为卸载这个软件提供重要的依据。固然Windows自带了一个Uninstall Shield,可是它好像并不能很清洁地把本来的软件卸掉,每次卸载总会留下一些讨厌的残渣,致使系统中的垃圾信息不绝增长,我们的硬盘空间也老是莫名其妙地越用越少。因此,一些号称可以或许完全卸载软件的专用卸载东西应运而生。在这个中,有一些就运用了监督系统的技能,好比Uninstaller Manager和RegMonitor。
下面我们开始接头如何编程实现这一监督成果。首先先容几个重要的api函数:
FindFirstChangeNotification( );
FindNextChangeNotification( );
WaitForSingleObject( );
个中FindFirstChangeNotification(lpzpath,fwatchsubtree,fdwfilter)中的lpzpath暗示要监督的路径名,fwatchsubtree判定是否查察子目次,fdwfilter为要监督的事件,函数执行乐成后返回一个句柄。
#p#副标题#e#
参数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( )可以实现雷同成果,这里暂省略之。
#p#分页标题#e#
怎么样,看过本文,是否对Uninstaller Manager和Reg Monitor这样的软件有了更深入的相识。在Windows编程中,有些API函数起到了重要的浸染,可以让措施实现许多高级的成果。因为API函数是凭据C语言语法给出的,所以C++Builder有着得天独厚的优势,对API函数和宏支持得很是好。欠好,怎么跑题了?
还愣着干吗,莫非你还不想赶紧动手体例一个本身的Uninstaller Manager吗?