前几天,公司项目需要,写了一个简单的注册表检查工具。目的是完成指定键值的期望值和实际注册表值的比较,并且输出不同的项。程序很简单。下面是代码,随后附上一些必要的解释。
#include "stdafx.h"
#include<afx.h>
#include<iostream>
#include<fstream>
#include<string>
#include<windows.h>
using namespace std;
string path="D:\\***。txt";//自己根据实际需求改
string result="D:\\**.txt";//自己根据实际需求改
void check_key(char pth[256],char nm[256],char vl[256]);//pth=key_path,nm=name,vl=value
bool strcompare(char* s1,char* s2);//s1注册表原值,s2文档中的值
int strlenth(char *str);//获取字符串长度
void write_result(char* o_path,char* o_name,char* o_value,char* sname,char* svalue);
int _tmain(int argc, _TCHAR* argv[])
{
//打开文件
while(1)
{
fstream out;
out.open(path);
string check;
int i=1;
while(!out.eof())
{
char key_path[256];
char name[256];
char value[256];
out.getline(key_path,256,'\n');
out.getline(name,256,'\n');
out.getline(value,256,'\n');
cout<<i<<' '<<key_path<<' '<<name<<' '<<value<<endl;
i++;
check_key(key_path,name,value);
}
out.close;
Sleep(10000);
}
system("PAUSE");
return 0;
}
void check_key(char pth[256],char nm[256],char vl[256])
{
//打开注册表
HKEY key;
//char数组转换为CString
CString p=(CString)pth;
LPCTSTR data=p.GetBuffer();
p.ReleaseBuffer();
if(RegOpenKeyEx(HKEY_CURRENT_USER,data,0,KEY_ALL_ACCESS,&key)!=ERROR_SUCCESS) //第一个参数根据实际需要改即可
cout<<"打开注册表错误!\n";
else
{
//获取子键/键值信息
DWORD dwIndex=0,NameSize,NameCnt,NameMaxLen,Type;
DWORD KeySize,KeyCnt,KeyMaxLen,DateSize,MaxDateLen;
if(RegQueryInfoKey(key,NULL,NULL,NULL,&KeyCnt,&KeyMaxLen,NULL,&NameCnt,&NameMaxLen,&MaxDateLen,NULL,NULL)!=ERROR_SUCCESS)
printf("RegQueryInfoKey错误");
else
{
//枚举键值信息
for(dwIndex=0;dwIndex<NameCnt;dwIndex++) //枚举键值
{
DateSize=MaxDateLen+1;
NameSize=NameMaxLen+1;
char* szValueName;
szValueName=new char[NameSize];
LPBYTE szValueDate;
szValueDate=(LPBYTE)malloc(DateSize);
char* szValueDate1;
/**//*参数定义请参照获取子键/键值信息部分...*/
RegEnumValue(key,dwIndex,szValueName,&NameSize,NULL,&Type,szValueDate,&DateSize);//读取键值
szValueDate1=(char *)szValueDate;
// cout<<"name:"<<szValueName<<" "<<"value:"<<szValueDate1<<endl;
//比较键值
if(!strlenth(szValueName))
{
delete szValueName;
szValueName="默认";
}
if((*szValueName)==(*nm))
{
if(!strcompare(szValueDate1,vl))//如果错,则输出
{
cout<<szValueName<<" "<<szValueDate1<<" "<<"failed"<<endl;
write_result(pth,nm,vl,szValueName,szValueDate1);
}
else
{
cout<<"success!"<<endl;
}
}
/* else
{
cout<<szValueName<<" "<<szValueDate1<<" "<<"failed"<<endl;
write_result(szValueName,szValueDate1);
}*/
free(szValueDate);
}
}
}
::RegCloseKey(key);
}
bool strcompare(char* s1,char* s2)//s1注册表原值,s2文档中的值
{
int len;
if((len=strlenth(s1))!=strlenth(s2))
{
return 0;
}
for(int i=0;i<len;i++)
{
if(s1[i]!=s2[i])
{
return 0;
}
}
return 1;
}
int strlenth(char *str)
{
int j;
for (j=0;str[j]!='\0';j++){};
return j;
}
void write_result(char* o_path,char* o_name,char* o_value,char* sname,char* svalue)
{
ofstream in;
in.open(result,0x08);
in<<"期望值:"<<o_path<<" "<<o_name<<" "<<o_value<<endl
<<"注册表值:"<<sname<<" "<<svalue<<endl;
in.close();
}
程序每隔10秒会运行一次。不过自己可以改。在win7和vista下,由于打开某些注册表需要权限设置,程序中并没有去实现这个功能,所有win7和vista可能会有一些键值无法打开。