现在的位置: 首页 > 综合 > 正文

自写的注册表操作函数

2013年08月28日 ⁄ 综合 ⁄ 共 4384字 ⁄ 字号 评论关闭
今天在教室看书实在无聊,赶上这两天在学习注册表操作函数,就写了这堆代码,写完在机子上运行了下感觉还不错,也就把注册表的一些信息写进了单项链表中,便于实现查找操作。
代码如下:
/*存放子键与键值的数据结构*/
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;}
}
 

 

抱歉!评论已关闭.