今天在教室看书实在无聊,赶上这两天在学习注册表操作函数,就写了这堆代码,写完在机子上运行了下感觉还不错,也就把注册表的一些信息写进了单项链表中,便于实现查找操作。
代码如下:
/**//*存放子键与键值的数据结构*/
typedef struct RegValueInfo
{
DWORD sValueCnt;//键值数量,用于头节点中
TCHAR sValueName[256];//键值名
TCHAR sValueData[256];//键值数据
DWORD sType;//键值类型
struct RegValueInfo *next;//指向下一节点的指针
}RegValueInfo,*PRegValueInfo;
typedef struct RegKeyInfo
{
DWORD dSunkeyCnt;//用于头节点中记录子键数量
TCHAR lpName[256];//子键名称
struct RegKeyInfo *next;//指向下一节点的指针
}RegKeyInfo,*PRegKeyInfo;
/** *//**************************************************************/
/**//*枚举键值名、数据、类型,并存放于链表中,RKI 为链表的头指针*/
/** *//**************************************************************/
BOOL MyRegEnumValue(
HKEY hKey,//打开注册表键的句柄
LPCTSTR lpSubKey,//要打开的注册表子键名称
REGSAM samDesired,//打开时所要的权限
RegValueInfo ** RKI//用于接收链表首地址的指针
)
{
int Ret=0;
HKEY hkey=NULL;
Ret=RegOpenKeyEx(hKey,lpSubKey,0,samDesired,&hKey);
if(ERROR_SUCCESS!=Ret)
{
cout<<"RegOpenKeyEx error ."<<endl;
RegCloseKey(hkey);
return FALSE;
}
DWORD dwIndex=0;//键值索引号
DWORD dwValueCnt;//键值数量
DWORD dwValueNameMaxLen;//键值名称最大长度
DWORD dwValueDataMaxLen;//键值数据最大长度
TCHAR *szValueName;//键值名称
BYTE *szValueData;//键值数据
DWORD dwValueType;//键值类型
Ret=RegQueryInfoKey(hKey,NULL,NULL,NULL,NULL,NULL,NULL,&dwValueCnt,&dwValueNameMaxLen,&dwValueDataMaxLen,NULL,NULL);
if(ERROR_SUCCESS!=Ret)
{
cout<<"RegQueryInfoKey error ."<<endl;
RegCloseKey(hKey);
return FALSE;
}
RegValueInfo * Tail;//尾指针
*RKI=new RegValueInfo;////构造单链表的头节点
(*RKI)->sValueCnt=dwValueCnt;
(*RKI)->next=NULL;
Tail=*RKI;
//开始枚举所有子键
for(;dwIndex<dwValueCnt;dwIndex++)
{
DWORD dwValueNameSize=dwValueNameMaxLen+1;
DWORD dwValueDataSize=dwValueDataMaxLen+1;
szValueName=new TCHAR[dwValueNameSize];
szValueData=new BYTE[dwValueDataSize];
RegEnumValue(hKey,dwIndex,szValueName,&dwValueNameSize,0,&dwValueType,(unsigned char *)szValueData,&dwValueDataSize);
RegValueInfo *NewNode=new RegValueInfo;
strcpy(NewNode->sValueName,szValueName);
strcpy(NewNode->sValueData,(const char *)szValueData);
NewNode->sType=dwValueType;
Tail->next=NewNode;
Tail=NewNode;
}//for
Tail->next=NULL;
return TRUE;
}//end_fun
/**//*枚举子键名,并存放于链表中,RKI 为链表头*/
BOOL MyRegEnumKey(
HKEY hKey,//打开注册表键的句柄
LPCTSTR lpSubKey,//要打开的注册表子键名称
REGSAM samDesired,//打开时所要的权限
RegKeyInfo ** RKI//用于接收链表首地址的指针
)
{
int Ret=0;
HKEY hkey=NULL;
Ret=RegOpenKeyEx(hKey,lpSubKey,0,samDesired,&hKey);
if(ERROR_SUCCESS!=Ret)
{
cout<<"RegOpenKeyEx error ."<<endl;
RegCloseKey(hkey);
return FALSE;
}
DWORD dwIndex=0;//子键索引号
DWORD dwKeyCnt;//子键数量
DWORD dwKeyMaxLen;//子键名称最大长度
TCHAR *szKeyName;//子键名称
Ret=RegQueryInfoKey(hKey,NULL,NULL,NULL,&dwKeyCnt,&dwKeyMaxLen,NULL,NULL,NULL,NULL,NULL,NULL);
if(ERROR_SUCCESS!=Ret)
{
cout<<"RegQueryInfoKey error ."<<endl;
RegCloseKey(hKey);
return FALSE;
}
RegKeyInfo * Tail;//尾指针
*RKI=new RegKeyInfo;////构造单链表的头节点
(*RKI)->dSunkeyCnt=dwKeyCnt;
(*RKI)->next=NULL;
Tail=*RKI;
//开始枚举所有子键
for(;dwIndex<dwKeyCnt;dwIndex++)
{
DWORD dwKeySize=dwKeyMaxLen+1;
szKeyName=new TCHAR[dwKeySize];
RegEnumKeyEx(hKey,dwIndex,szKeyName,&dwKeySize,0,NULL,NULL,NULL);
RegKeyInfo *NewNode=new RegKeyInfo;
strcpy(NewNode->lpName,szKeyName);
Tail->next=NewNode;
Tail=NewNode;
}//for
Tail->next=NULL;
return TRUE;
}//end_fun
/** *//********************************************************/
#include<windows.h>
#include<iostream.h>
void main()
{
RegValueInfo * p1;
RegKeyInfo * p2;
BOOL ret=FALSE;
ret=MyRegEnumValue(HKEY_LOCAL_MACHINE,"software\\microsoft\\windows\\currentversion",KEY_ALL_ACCESS,&p1);
if(FALSE==ret)
{
cout<<"wrong"<<endl;
return;
}
cout<<"输出键值信息"<<endl;
cout<<"子键数量:"<<p->sValueCnt<<endl;
for(p1=p1->next;p1;p1=p1->next)
{cout<<p1->sValueName<<endl;
cout<<p1->sValueData<<endl;
cout<<p1->sType<<endl;
}
cout<<"=========================================="<<endl;
cout<<"输出子键信息"<<endl;
ret=MyRegEnumValue(HKEY_LOCAL_MACHINE,"software\\microsoft\\windows\\currentversion",KEY_ALL_ACCESS,&p2);
if(FALSE==ret)
{
cout<<"wrong"<<endl;
return;
}
cout<<"子键数量:"<<p2->dSunkeyCnt;
for(p=p->next;p;p=p->next)
{cout<<p->lpName<<endl;}
}
posted on 2008-06-14 09:39
杨彬彬 阅读(270)
评论(0) 编辑 收藏 引用 所属分类:
Windows编程