随笔 - 8  文章 - 26  trackbacks - 0
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(4)

随笔档案

文章分类

文章档案

相册

C++语言

搜索

  •  

最新评论

阅读排行榜

评论排行榜

今天在教室看书实在无聊,赶上这两天在学习注册表操作函数,就写了这堆代码,写完在机子上运行了下感觉还不错,也就把注册表的一些信息写进了单项链表中,便于实现查找操作。
代码如下:
/*存放子键与键值的数据结构*/
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 杨彬彬 阅读(256) 评论(0)  编辑 收藏 引用 所属分类: Windows编程

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理