 今天在教室看书实在无聊,赶上这两天在学习注册表操作函数,就写了这堆代码,写完在机子上运行了下感觉还不错,也就把注册表的一些信息写进了单项链表中,便于实现查找操作。
今天在教室看书实在无聊,赶上这两天在学习注册表操作函数,就写了这堆代码,写完在机子上运行了下感觉还不错,也就把注册表的一些信息写进了单项链表中,便于实现查找操作。
 代码如下:
代码如下:

 /**//*存放子键与键值的数据结构*/
/**//*存放子键与键值的数据结构*/
 typedef struct RegValueInfo
typedef struct RegValueInfo


 {
{
 DWORD sValueCnt;//键值数量,用于头节点中
DWORD sValueCnt;//键值数量,用于头节点中
 TCHAR sValueName[256];//键值名
TCHAR sValueName[256];//键值名
 TCHAR sValueData[256];//键值数据
TCHAR sValueData[256];//键值数据
 DWORD sType;//键值类型
DWORD sType;//键值类型
 struct RegValueInfo *next;//指向下一节点的指针
struct RegValueInfo *next;//指向下一节点的指针
 }RegValueInfo,*PRegValueInfo;
}RegValueInfo,*PRegValueInfo;
 
 
 typedef struct RegKeyInfo
typedef struct RegKeyInfo


 {
{
 DWORD dSunkeyCnt;//用于头节点中记录子键数量
DWORD dSunkeyCnt;//用于头节点中记录子键数量
 TCHAR lpName[256];//子键名称
TCHAR lpName[256];//子键名称
 struct RegKeyInfo *next;//指向下一节点的指针
struct RegKeyInfo *next;//指向下一节点的指针
 }RegKeyInfo,*PRegKeyInfo;
}RegKeyInfo,*PRegKeyInfo;
 
 

 /** *//**************************************************************/
/** *//**************************************************************/

 /**//*枚举键值名、数据、类型,并存放于链表中,RKI 为链表的头指针*/
/**//*枚举键值名、数据、类型,并存放于链表中,RKI 为链表的头指针*/

 /** *//**************************************************************/
/** *//**************************************************************/
 BOOL MyRegEnumValue(
BOOL MyRegEnumValue(
 HKEY hKey,//打开注册表键的句柄
                               HKEY hKey,//打开注册表键的句柄
 LPCTSTR lpSubKey,//要打开的注册表子键名称
                   LPCTSTR lpSubKey,//要打开的注册表子键名称
 REGSAM samDesired,//打开时所要的权限
                   REGSAM samDesired,//打开时所要的权限
 RegValueInfo ** RKI//用于接收链表首地址的指针
                   RegValueInfo ** RKI//用于接收链表首地址的指针
 )
                             )


 {
{
 int Ret=0;
int Ret=0;
 HKEY hkey=NULL;
HKEY hkey=NULL;
 Ret=RegOpenKeyEx(hKey,lpSubKey,0,samDesired,&hKey);
Ret=RegOpenKeyEx(hKey,lpSubKey,0,samDesired,&hKey);
 if(ERROR_SUCCESS!=Ret)
if(ERROR_SUCCESS!=Ret)


 {
{
 
 
 cout<<"RegOpenKeyEx error ."<<endl;
cout<<"RegOpenKeyEx error ."<<endl;
 RegCloseKey(hkey);
RegCloseKey(hkey);
 return FALSE;
return FALSE;
 }
}                           
 DWORD dwIndex=0;//键值索引号
DWORD dwIndex=0;//键值索引号
 DWORD dwValueCnt;//键值数量
DWORD dwValueCnt;//键值数量
 DWORD dwValueNameMaxLen;//键值名称最大长度
DWORD dwValueNameMaxLen;//键值名称最大长度
 DWORD dwValueDataMaxLen;//键值数据最大长度
DWORD dwValueDataMaxLen;//键值数据最大长度
 TCHAR *szValueName;//键值名称
TCHAR *szValueName;//键值名称
 BYTE *szValueData;//键值数据
BYTE *szValueData;//键值数据
 DWORD dwValueType;//键值类型
DWORD dwValueType;//键值类型
 
 
 
 
 Ret=RegQueryInfoKey(hKey,NULL,NULL,NULL,NULL,NULL,NULL,&dwValueCnt,&dwValueNameMaxLen,&dwValueDataMaxLen,NULL,NULL);
Ret=RegQueryInfoKey(hKey,NULL,NULL,NULL,NULL,NULL,NULL,&dwValueCnt,&dwValueNameMaxLen,&dwValueDataMaxLen,NULL,NULL);
 if(ERROR_SUCCESS!=Ret)
if(ERROR_SUCCESS!=Ret)


 {
{
 
 
 cout<<"RegQueryInfoKey error ."<<endl;
cout<<"RegQueryInfoKey error ."<<endl;
 RegCloseKey(hKey);
RegCloseKey(hKey);
 return FALSE;
return FALSE;
 }
}            
 
                             
 
 
 RegValueInfo * Tail;//尾指针
RegValueInfo * Tail;//尾指针
 *RKI=new RegValueInfo;////构造单链表的头节点
*RKI=new RegValueInfo;////构造单链表的头节点
 (*RKI)->sValueCnt=dwValueCnt;
(*RKI)->sValueCnt=dwValueCnt;                        
 (*RKI)->next=NULL;
(*RKI)->next=NULL;
 Tail=*RKI;
Tail=*RKI;
 //开始枚举所有子键
//开始枚举所有子键
 for(;dwIndex<dwValueCnt;dwIndex++)
for(;dwIndex<dwValueCnt;dwIndex++)


 {
{
 DWORD dwValueNameSize=dwValueNameMaxLen+1;
DWORD dwValueNameSize=dwValueNameMaxLen+1;
 DWORD dwValueDataSize=dwValueDataMaxLen+1;
DWORD dwValueDataSize=dwValueDataMaxLen+1;
 szValueName=new TCHAR[dwValueNameSize];
szValueName=new TCHAR[dwValueNameSize]; 
 szValueData=new BYTE[dwValueDataSize];
szValueData=new BYTE[dwValueDataSize];
 
 
 RegEnumValue(hKey,dwIndex,szValueName,&dwValueNameSize,0,&dwValueType,(unsigned char *)szValueData,&dwValueDataSize);
RegEnumValue(hKey,dwIndex,szValueName,&dwValueNameSize,0,&dwValueType,(unsigned char *)szValueData,&dwValueDataSize);
 RegValueInfo *NewNode=new RegValueInfo;
RegValueInfo *NewNode=new RegValueInfo;
 strcpy(NewNode->sValueName,szValueName);
strcpy(NewNode->sValueName,szValueName);
 strcpy(NewNode->sValueData,(const char *)szValueData);
strcpy(NewNode->sValueData,(const char *)szValueData);
 NewNode->sType=dwValueType;
NewNode->sType=dwValueType;
 Tail->next=NewNode;
Tail->next=NewNode;
 Tail=NewNode;
Tail=NewNode;
 }//for
}//for                            
 
                             
 Tail->next=NULL;
Tail->next=NULL;                        
 return TRUE;
return TRUE;                                                          
 }//end_fun
 }//end_fun
 
 

 /**//*枚举子键名,并存放于链表中,RKI 为链表头*/
/**//*枚举子键名,并存放于链表中,RKI 为链表头*/
 
 
 BOOL MyRegEnumKey(
BOOL MyRegEnumKey(
 HKEY hKey,//打开注册表键的句柄
                               HKEY hKey,//打开注册表键的句柄
 LPCTSTR lpSubKey,//要打开的注册表子键名称
                   LPCTSTR lpSubKey,//要打开的注册表子键名称
 REGSAM samDesired,//打开时所要的权限
                   REGSAM samDesired,//打开时所要的权限
 RegKeyInfo ** RKI//用于接收链表首地址的指针
                   RegKeyInfo ** RKI//用于接收链表首地址的指针
 )
                             )


 {
{
 int Ret=0;
int Ret=0;
 HKEY hkey=NULL;
HKEY hkey=NULL;
 Ret=RegOpenKeyEx(hKey,lpSubKey,0,samDesired,&hKey);
Ret=RegOpenKeyEx(hKey,lpSubKey,0,samDesired,&hKey);
 if(ERROR_SUCCESS!=Ret)
if(ERROR_SUCCESS!=Ret)


 {
{
 
 
 cout<<"RegOpenKeyEx error ."<<endl;
cout<<"RegOpenKeyEx error ."<<endl;
 RegCloseKey(hkey);
RegCloseKey(hkey);
 return FALSE;
return FALSE;
 }
}                           
 DWORD dwIndex=0;//子键索引号
DWORD dwIndex=0;//子键索引号
 DWORD dwKeyCnt;//子键数量
DWORD dwKeyCnt;//子键数量
 DWORD dwKeyMaxLen;//子键名称最大长度
DWORD dwKeyMaxLen;//子键名称最大长度
 TCHAR *szKeyName;//子键名称
TCHAR *szKeyName;//子键名称
 
 
 Ret=RegQueryInfoKey(hKey,NULL,NULL,NULL,&dwKeyCnt,&dwKeyMaxLen,NULL,NULL,NULL,NULL,NULL,NULL);
Ret=RegQueryInfoKey(hKey,NULL,NULL,NULL,&dwKeyCnt,&dwKeyMaxLen,NULL,NULL,NULL,NULL,NULL,NULL);
 if(ERROR_SUCCESS!=Ret)
if(ERROR_SUCCESS!=Ret)


 {
{
 
 
 cout<<"RegQueryInfoKey error ."<<endl;
cout<<"RegQueryInfoKey error ."<<endl;
 RegCloseKey(hKey);
RegCloseKey(hKey);
 return FALSE;
return FALSE;
 }
}            
 
                             
 
 
 RegKeyInfo * Tail;//尾指针
RegKeyInfo * Tail;//尾指针
 *RKI=new RegKeyInfo;////构造单链表的头节点
*RKI=new RegKeyInfo;////构造单链表的头节点
 (*RKI)->dSunkeyCnt=dwKeyCnt;
(*RKI)->dSunkeyCnt=dwKeyCnt;                       
 (*RKI)->next=NULL;
(*RKI)->next=NULL;
 Tail=*RKI;
Tail=*RKI;
 //开始枚举所有子键
//开始枚举所有子键
 for(;dwIndex<dwKeyCnt;dwIndex++)
for(;dwIndex<dwKeyCnt;dwIndex++)


 {
{
 DWORD dwKeySize=dwKeyMaxLen+1;
DWORD dwKeySize=dwKeyMaxLen+1;
 szKeyName=new TCHAR[dwKeySize];
szKeyName=new TCHAR[dwKeySize]; 
 RegEnumKeyEx(hKey,dwIndex,szKeyName,&dwKeySize,0,NULL,NULL,NULL);
RegEnumKeyEx(hKey,dwIndex,szKeyName,&dwKeySize,0,NULL,NULL,NULL);
 RegKeyInfo *NewNode=new RegKeyInfo;
RegKeyInfo *NewNode=new RegKeyInfo;
 strcpy(NewNode->lpName,szKeyName);
strcpy(NewNode->lpName,szKeyName);
 Tail->next=NewNode;
Tail->next=NewNode;
 Tail=NewNode;
Tail=NewNode;
 }//for
}//for                            
 
                             
 Tail->next=NULL;
Tail->next=NULL;                        
 return TRUE;
return TRUE;                                                          
 }//end_fun
 }//end_fun
 
 

 /** *//********************************************************/
/** *//********************************************************/
 #include<windows.h>
#include<windows.h>
 #include<iostream.h>
#include<iostream.h>
 void main()
void main()


 {
{
 RegValueInfo * p1;
RegValueInfo * p1;
 RegKeyInfo * p2;
RegKeyInfo * p2;
 
 
 BOOL ret=FALSE;
BOOL ret=FALSE;
 ret=MyRegEnumValue(HKEY_LOCAL_MACHINE,"software\\microsoft\\windows\\currentversion",KEY_ALL_ACCESS,&p1);
ret=MyRegEnumValue(HKEY_LOCAL_MACHINE,"software\\microsoft\\windows\\currentversion",KEY_ALL_ACCESS,&p1);
 if(FALSE==ret)
if(FALSE==ret)


 {
{
 cout<<"wrong"<<endl;
cout<<"wrong"<<endl;
 return;
return;
 }
}
 
 
 cout<<"输出键值信息"<<endl;
cout<<"输出键值信息"<<endl;
 cout<<"子键数量:"<<p->sValueCnt<<endl;
cout<<"子键数量:"<<p->sValueCnt<<endl;
 for(p1=p1->next;p1;p1=p1->next)
for(p1=p1->next;p1;p1=p1->next)


 {cout<<p1->sValueName<<endl;
{cout<<p1->sValueName<<endl;
 cout<<p1->sValueData<<endl;
cout<<p1->sValueData<<endl;
 cout<<p1->sType<<endl;
cout<<p1->sType<<endl;
 }
}
 cout<<"=========================================="<<endl;
cout<<"=========================================="<<endl;
 cout<<"输出子键信息"<<endl;
cout<<"输出子键信息"<<endl;
 ret=MyRegEnumValue(HKEY_LOCAL_MACHINE,"software\\microsoft\\windows\\currentversion",KEY_ALL_ACCESS,&p2);
ret=MyRegEnumValue(HKEY_LOCAL_MACHINE,"software\\microsoft\\windows\\currentversion",KEY_ALL_ACCESS,&p2);
 if(FALSE==ret)
if(FALSE==ret)


 {
{
 cout<<"wrong"<<endl;
cout<<"wrong"<<endl;
 return;
return;
 }
}
 cout<<"子键数量:"<<p2->dSunkeyCnt;
cout<<"子键数量:"<<p2->dSunkeyCnt;
 for(p=p->next;p;p=p->next)
for(p=p->next;p;p=p->next)


 {cout<<p->lpName<<endl;}
{cout<<p->lpName<<endl;} 
 }
}

posted on 2008-06-14 09:39 
杨彬彬 阅读(306) 
评论(0)  编辑 收藏 引用  所属分类: 
Windows编程