今天在教室看書實在無聊,趕上這兩天在學習注冊表操作函數,就寫了這堆代碼,寫完在機子上運行了下感覺還不錯,也就把注冊表的一些信息寫進了單項鏈表中,便于實現查找操作。
代碼如下:

/**//*存放子鍵與鍵值的數據結構*/
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
楊彬彬 閱讀(287)
評論(0) 編輯 收藏 引用 所屬分類:
Windows編程