luoshayu 2006-4-22 17:31
一个封装注册表函数的类
regcls.h
#ifndef _REG_CLASS_H_
#define _REG_CLASS_H_
#include <windows.h>
#include <string>
#include <list>
using namespace std;
class REGKEY
{
public:
DWORD m_dwType;
string m_sValue;
string m_sKeyName;
REGKEY()
{
;
}
REGKEY(DWORD dwType,LPCSTR psName,LPCSTR psValue)
{
m_dwType = dwType;
if(psName)
m_sKeyName = psName;
if(psValue)
m_sValue = psValue;
}
};
class CRegClass
{
public:
CRegClass(HKEY hRoot = NULL)
{
if(hRoot==NULL)
m_hRoot = HKEY_LOCAL_MACHINE;
else
m_hRoot = hRoot;
}
~CRegClass()
{
;
}
//设置注册表操作的根
void SetRegRoot(HKEY hRoot)
{
m_hRoot = hRoot;
}
//得到一个注册表项的所有键
bool GetRegAllSubValue(LPCSTR lpKey,list<REGKEY> &subValueList)
{
HKEY hKey = NULL;
string sName ;
DWORD dwType = 0;
char * psValue = NULL;
DWORD dwIndex = 0;
DWORD dwValLen = 0;
DWORD dwNameLen = 0;
char szName[1024] = "";
if(!lpKey || RegOpenKey(m_hRoot,lpKey,&hKey)!=ERROR_SUCCESS)
return false;
//枚举
while(true)
{
//得到值的长度
dwNameLen = sizeof(szName);
dwValLen = 0;
RegEnumValue(hKey,dwIndex,szName,&dwNameLen,NULL,&dwType,NULL,&dwValLen);
if(sName.compare(szName)==0)
break;
sName = szName;
if(dwValLen==0)
{
subValueList.push_back(REGKEY(dwType,szName,NULL));
dwIndex++;
continue;
}
dwNameLen = sizeof(szName);
dwValLen +=1;
psValue = new char[dwValLen];
RegEnumValue(hKey,dwIndex,szName,&dwNameLen,NULL,&dwType,(BYTE *)psValue,&dwValLen);
REGKEY regKey ;
regKey.m_dwType = dwType;
regKey.m_sKeyName = szName;
regKey.m_sValue.append(psValue,dwValLen);
delete [] psValue;
psValue = NULL;
subValueList.push_back(regKey);
dwIndex++;
}
return true;
}
//得到一个注册表项的所有子项
bool GetRegAllSubKey(LPCSTR lpKey,list<string> &subKeyList)
{
HKEY hKey = NULL;
string sName ;
DWORD dwIndex = 0;
DWORD dwNameLen = 0;
char szName[1024] = "";
if(!lpKey || RegOpenKey(m_hRoot,lpKey,&hKey)!=ERROR_SUCCESS)
return false;
//枚举
while(true)
{
//得到值的长度
dwNameLen = sizeof(szName);
RegEnumKey(hKey,dwIndex,szName,dwNameLen);
if(sName.compare(szName)==0)
break;
sName = szName;
subKeyList.push_back(szName);
dwIndex++;
}
return true;
}
bool ReadReg(LPCSTR lpKey,LPCSTR lpItem,DWORD &dwType,LPSTR lpBuf,DWORD &bufLen)
{
HKEY hKey = NULL;
if(lpKey==NULL || strlen(lpKey)==0)
return false;
if(RegOpenKey(m_hRoot,lpKey,&hKey)!=ERROR_SUCCESS)
return false;
if(RegQueryValueEx(hKey,lpItem,NULL,&dwType,(unsigned char *)lpBuf,&bufLen)!=ERROR_SUCCESS)
return FALSE;
RegCloseKey(hKey);
hKey = NULL;
return true;
}
bool WriteReg(LPCSTR lpKey,LPCSTR lpItem,DWORD dwType,LPCSTR lpBuf,DWORD bufLen)
{
HKEY hKey = NULL;
if(!lpKey || strlen(lpKey)==0)
return false;
if(!CreateRegTree(lpKey))
return false;
if(RegOpenKey(m_hRoot,lpKey,&hKey)!=ERROR_SUCCESS)
return false;
if(!RegSetValueEx(hKey,lpItem,0,dwType,(BYTE *)lpBuf,bufLen)!=ERROR_SUCCESS)
return false;
RegCloseKey(hKey);
return true;
}
//读一个注册表项
bool ReadReg(LPCSTR lpKey,DWORD &dwType,LPSTR lpBuf,DWORD &bufLen)
{
int n = 0;
string::size_type nPos ;
bool bRet = false;
string sKey ;
string sPath ;
if(!lpKey)
{
return false;
}
sPath = lpKey;
if((nPos = sPath.rfind("\\"))==string::npos)
return false;
sKey = sPath.substr(nPos+1);
sPath.erase(nPos);
return ReadReg(sPath.c_str(),sKey.c_str(),dwType,lpBuf,bufLen);
}
//写一个注册表项
bool WriteReg(LPCSTR lpKey,DWORD dwType,LPCSTR lpBuf,DWORD dwBufLen)
{
int n = 0;
HKEY hKey = NULL;
string::size_type nPos ;
bool bRet = false;
string sKey ;
string sPath ;
if(!lpKey)
{
return false;
}
sPath = lpKey;
if((nPos = sPath.rfind("\\"))==string::npos)
return false;
sKey = sPath.substr(nPos+1);
sPath.erase(nPos);
return WriteReg(sPath.c_str(),sKey.c_str(),dwType,lpBuf,dwBufLen);
}
//删除一个注册表项
bool DelRegKey(LPCSTR lpKey)
{
int n = 0;
HKEY hKey = NULL;
string::size_type nPos ;
bool bRet = false;
string sKey ;
string sPath ;
if(!lpKey)
{
return false;
}
sPath = lpKey;
if((nPos = sPath.rfind("\\"))==string::npos)
return false;
sKey = sPath.substr(nPos+1);
sPath.erase(nPos);
if(RegOpenKey(m_hRoot,sPath.c_str(),&hKey)!=ERROR_SUCCESS)
return false;
RegDeleteKey(hKey,sKey.c_str());
RegCloseKey(hKey);
return true;
}
//删除一个注册表项的值
bool DelRegValue(LPCSTR lpKey)
{
int n = 0;
HKEY hKey = NULL;
string::size_type nPos ;
bool bRet = false;
string sKey ;
string sPath ;
if(!lpKey)
{
return false;
}
sPath = lpKey;
if((nPos = sPath.rfind("\\"))==string::npos)
return false;
sKey = sPath.substr(nPos+1);
sPath.erase(nPos);
if(RegOpenKey(m_hRoot,sPath.c_str(),&hKey)!=ERROR_SUCCESS)
return false;
RegDeleteValue(hKey,sKey.c_str());
RegCloseKey(hKey);
return true;
}
//删除一个注册表树
bool DelRegTree(LPCSTR lpKey)
{
//搜索所有的子项
string::size_type nPos ;
string sKey ;
HKEY hSubKey = NULL;
string sSubKey ;
string sParentKey ;
list<string> subKeyList ;
if(!lpKey)
return false;
sParentKey = lpKey;
nPos = sParentKey.rfind("\\");
if(nPos==string::npos)
{
return false;
}
sKey = sParentKey.substr(nPos+1);
sParentKey.erase(nPos);
GetRegAllSubKey(lpKey,subKeyList);
for(list<string>::iterator iter = subKeyList.begin();iter!=subKeyList.end();iter++)
{
sSubKey = lpKey;
if(sSubKey.at(sSubKey.size()-1)!='\\')
sSubKey+="\\";
sSubKey+=*iter;
DelRegTree(sSubKey.c_str());
}
//打开父项
RegOpenKey(m_hRoot,sParentKey.c_str(),&hSubKey);
if(!hSubKey)
return false;
RegDeleteKey(hSubKey,sKey.c_str());
RegCloseKey(hSubKey);
hSubKey = NULL;
return true;
}
//创建一个注册表树
bool CreateRegTree(LPCSTR lpKey)
{
int n = 0;
HKEY hKey = NULL;
string::size_type nPos ;
bool bRet = false;
string sKey ;
string sPath ;
HKEY hSubKey = NULL;
bool bBreak = false;
if(!lpKey)
{
return false;
}
sPath = lpKey;
if((nPos = sPath.rfind("\\"))==string::npos)
return false;
while(1)
{
if((nPos=sPath.find(nPos,'\\'))==string::npos)
{
sKey = sPath;
bBreak = true;
bRet = true;
}
else
{
sKey = sPath.substr(0,nPos);
nPos+=1;
}
if(RegOpenKey(m_hRoot,sKey.c_str(),&hKey)!=ERROR_SUCCESS)
{
//如果打开失败则创建
if(RegCreateKeyEx(m_hRoot,sKey.c_str(),0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hSubKey,NULL)==ERROR_SUCCESS)
{
RegCloseKey(hSubKey);
hSubKey = NULL;
}
else
{
bBreak = true;
bRet = false;
}
}
else
RegCloseKey(hKey);
if(bBreak)
break;
}
return bRet;
}
private:
HKEY m_hRoot ;
};
#endif _REG_CLASS_H_