📄 appregistry.cpp
字号:
//处读取一个字符串。
BOOL CAppRegistry::GetRegString(LPCTSTR lpszSubItem, LPCTSTR lpszName, LPTSTR lpBuff, int iMaxStr) const
{
if(::lstrlen(APPREG_SAFESTRPTR(lpszSubItem))>=APPREG_MAXSUBITEM)
return FALSE;
if(::lstrlen(APPREG_SAFESTRPTR(lpszName))>=APPREG_MAXNAME)
return FALSE;
if(lpBuff==NULL||iMaxStr<0)
return FALSE;
BOOL bRet;
DWORD dwDis;
HKEY hRegKey;
long lRetVal;
TCHAR atcPath[APPREG_MAXPATH];
::_stprintf(atcPath,_T("%s\\%s\\%s\\%s\\%s\\%s"),
m_atcRoot,
m_atcCom,
m_atcApp,
m_atcVer,
m_atcItem,
APPREG_SAFESTRPTR(lpszSubItem)); //合成合法注册表路径字符串
//排除非法路径
for(int i=0;atcPath[i];i++)
{
//如果有连续的'\'或者最后一个字符为'\'或者第一个字符为'\'...
if(atcPath[i]==TCHAR('\\')&&(atcPath[i+1]==TCHAR('\\')||atcPath[i+1]==TCHAR(0)||i==0))
{
for(int j=i;atcPath[j];j++)
{
atcPath[j]=atcPath[j+1];
}
}
}
lRetVal=::RegCreateKeyEx(m_hRegRootKey,
atcPath,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,//KEY_CREATE_SUB_KEY|KEY_READ|KEY_WRITE,
NULL,
&hRegKey,
&dwDis);
if(lRetVal==ERROR_SUCCESS)
{
TCHAR * ptcBuff;
DWORD dwType,dwDataSize;
lRetVal=::RegQueryValueEx(hRegKey,APPREG_SAFESTRPTR(lpszName),NULL,&dwType,NULL,&dwDataSize);
if(lRetVal==ERROR_SUCCESS&&dwType==REG_SZ)
{
ptcBuff=new TCHAR[dwDataSize/sizeof(TCHAR)];
_ASSERT(ptcBuff);
lRetVal=::RegQueryValueEx(hRegKey,APPREG_SAFESTRPTR(lpszName),NULL,&dwType,LPBYTE(ptcBuff),&dwDataSize);
if(lRetVal==ERROR_SUCCESS)
{
bRet=TRUE;
::lstrcpyn(lpBuff,ptcBuff,iMaxStr);
}
else
bRet=FALSE;
delete[] ptcBuff;
} //if(lRetVal==ERROR_SUCCESS&&dwType==REG_SZ)
else
bRet=FALSE;
::RegCloseKey(hRegKey);
} //if(lRetVal==ERROR_SUCCESS)
else
bRet=FALSE;
return bRet;
}
//在注册表中保存一个二进制数据块
//<参数>
// lpszSubItem: 以NULL结束的子项目名称字符串
// lpszName: 以NULL结束的int值名称字符串
// lpData: 指向要保存的二进制数据块
// iDataSize: 数据块的字节长度
//<返回值>
// 如果成功返回TRUE,否则返回FALSE。
// lpData指向的二进制数据块将被保存在系统注册表的
//“HKEY_LOCAL_MACHINE\根项\公司名称\应用程序名称\版本\项目\子项目\数据块值名称”
//位置。
BOOL CAppRegistry::SetRegBinary(LPCTSTR lpszSubItem, LPCTSTR lpszName, LPVOID lpData, int iDataSize) const
{
if(::lstrlen(APPREG_SAFESTRPTR(lpszSubItem))>=APPREG_MAXSUBITEM)
return FALSE;
if(::lstrlen(APPREG_SAFESTRPTR(lpszName))>=APPREG_MAXNAME)
return FALSE;
if(lpData==NULL||iDataSize<0)
return FALSE;
BOOL bRet;
DWORD dwDis;
HKEY hRegKey;
long lRetVal;
TCHAR atcPath[APPREG_MAXPATH];
::_stprintf(atcPath,_T("%s\\%s\\%s\\%s\\%s\\%s"),
m_atcRoot,
m_atcCom,
m_atcApp,
m_atcVer,
m_atcItem,
APPREG_SAFESTRPTR(lpszSubItem));
//排除非法路径
for(int i=0;atcPath[i];i++)
{
//如果有连续的'\'或者最后一个字符为'\'或者第一个字符为'\'...
if(atcPath[i]==TCHAR('\\')&&(atcPath[i+1]==TCHAR('\\')||atcPath[i+1]==TCHAR(0)||i==0))
{
for(int j=i;atcPath[j];j++)
{
atcPath[j]=atcPath[j+1];
}
}
}
lRetVal=::RegCreateKeyEx(m_hRegRootKey,
atcPath,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,//KEY_CREATE_SUB_KEY|KEY_READ|KEY_WRITE,
NULL,
&hRegKey,
&dwDis);
if(lRetVal==ERROR_SUCCESS)
{
lRetVal=::RegSetValueEx(hRegKey,APPREG_SAFESTRPTR(lpszName),0,REG_BINARY,LPBYTE(lpData),iDataSize);
if(lRetVal==ERROR_SUCCESS)
bRet=TRUE;
else
bRet=FALSE;
::RegCloseKey(hRegKey);
}
else
bRet=FALSE;
return bRet;
}
//在注册表中读取指定二进制数据块的长度
//<参数>
// lpszSubItem: 以NULL结束的子项目名称字符串
// lpszName: 以NULL结束的int值名称字符串
//<返回值>
// 如果失败返回-1,否则返回指定二进制数据块的长度
// GetRegBinarySize将返回在系统注册表的
//“HKEY_LOCAL_MACHINE\根项\公司名称\应用程序名称\版本\项目\子项目\字符串值名称”
//位置的二进制数据块的长度。
int CAppRegistry::GetRegBinarySize(LPCTSTR lpszSubItem, LPCTSTR lpszName) const
{
if(::lstrlen(APPREG_SAFESTRPTR(lpszSubItem))>=APPREG_MAXSUBITEM)
return -1;
if(::lstrlen(APPREG_SAFESTRPTR(lpszName))>=APPREG_MAXNAME)
return -1;
int iRet;
DWORD dwDis;
HKEY hRegKey;
long lRetVal;
TCHAR atcPath[APPREG_MAXPATH];
::_stprintf(atcPath,_T("%s\\%s\\%s\\%s\\%s\\%s"),
m_atcRoot,
m_atcCom,
m_atcApp,
m_atcVer,
m_atcItem,
APPREG_SAFESTRPTR(lpszSubItem));
//排除非法路径
for(int i=0;atcPath[i];i++)
{
//如果有连续的'\'或者最后一个字符为'\'或者第一个字符为'\'...
if(atcPath[i]==TCHAR('\\')&&(atcPath[i+1]==TCHAR('\\')||atcPath[i+1]==TCHAR(0)||i==0))
{
for(int j=i;atcPath[j];j++)
{
atcPath[j]=atcPath[j+1];
}
}
}
lRetVal=::RegCreateKeyEx(m_hRegRootKey,
atcPath,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,//KEY_CREATE_SUB_KEY|KEY_READ|KEY_WRITE,
NULL,
&hRegKey,
&dwDis);
if(lRetVal==ERROR_SUCCESS)
{
DWORD dwType,dwDataSize;
lRetVal=::RegQueryValueEx(hRegKey,APPREG_SAFESTRPTR(lpszName),NULL,&dwType,NULL,&dwDataSize);
if(lRetVal==ERROR_SUCCESS&&dwType==REG_BINARY)
iRet=int(dwDataSize);
else
iRet=-1;
::RegCloseKey(hRegKey);
}
else
iRet=-1;
return iRet;
}
//在注册表中读取一个二进制数据块
//<参数>
// lpszSubItem: 以NULL结束的子项目名称字符串
// lpszName: 以NULL结束的int值名称字符串
// lpBuff: 指向用于存放二进制数据块的缓冲区
// iMaxSize: lpBuff所指缓冲区的容量
//<返回值>
// 如果成功返回TRUE,否则返回FALSE。
// GetRegBinary将从系统注册表的
//“HKEY_LOCAL_MACHINE\根项\公司名称\应用程序名称\版本\项目\子项目\二进制数据块值名称”
//处读取一个二进制数据块。
BOOL CAppRegistry::GetRegBinary(LPCTSTR lpszSubItem, LPCTSTR lpszName, LPVOID lpBuff, int iMaxSize) const
{
if(::lstrlen(APPREG_SAFESTRPTR(lpszSubItem))>=APPREG_MAXSUBITEM)
return FALSE;
if(::lstrlen(APPREG_SAFESTRPTR(lpszName))>=APPREG_MAXNAME)
return FALSE;
if(lpBuff==NULL||iMaxSize<0)
return FALSE;
BOOL bRet;
DWORD dwDis;
HKEY hRegKey;
long lRetVal;
TCHAR atcPath[APPREG_MAXPATH];
::_stprintf(atcPath,_T("%s\\%s\\%s\\%s\\%s\\%s"),
m_atcRoot,
m_atcCom,
m_atcApp,
m_atcVer,
m_atcItem,
APPREG_SAFESTRPTR(lpszSubItem));
//排除非法路径
for(int i=0;atcPath[i];i++)
{
//如果有连续的'\'或者最后一个字符为'\'或者第一个字符为'\'...
if(atcPath[i]==TCHAR('\\')&&(atcPath[i+1]==TCHAR('\\')||atcPath[i+1]==TCHAR(0)||i==0))
{
for(int j=i;atcPath[j];j++)
{
atcPath[j]=atcPath[j+1];
}
}
}
lRetVal=::RegCreateKeyEx(m_hRegRootKey,
atcPath,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,//KEY_CREATE_SUB_KEY|KEY_READ|KEY_WRITE,
NULL,
&hRegKey,
&dwDis);
if(lRetVal==ERROR_SUCCESS)
{
LPBYTE pBuff;
DWORD dwType,dwDataSize;
lRetVal=::RegQueryValueEx(hRegKey,APPREG_SAFESTRPTR(lpszName),NULL,&dwType,NULL,&dwDataSize);
if(lRetVal==ERROR_SUCCESS&&dwType==REG_BINARY)
{
pBuff=new BYTE[dwDataSize];
_ASSERT(pBuff);
lRetVal=::RegQueryValueEx(hRegKey,APPREG_SAFESTRPTR(lpszName),NULL,&dwType,LPBYTE(pBuff),&dwDataSize);
if(lRetVal==ERROR_SUCCESS)
{
bRet=TRUE;
::memcpy(lpBuff,pBuff,min(dwDataSize,DWORD(iMaxSize)));
}
else
bRet=FALSE;
delete[] pBuff;
}
else
bRet=FALSE;
::RegCloseKey(hRegKey);
}
else
bRet=FALSE;
return bRet;
}
//删除当前版本的应用程序当前项目的指定子项目在注册表中的所有数据
//<参数>
// lpszSubItem: 指定子项目
//<返回值>
// 如果成功返回TRUE,否则返回FALSE。
// RemoveItem将把系统注册表中
//“HKEY_LOCAL_MACHINE\根项\公司名称\应用程序名称\版本\项目\lpszSubItem”
//项目下的所有数据都删除,包括“lpszSubItem”项目本身。另外,如果lpszSubItem
//为""或者NULL,RemoveItem将删除当前“项目”。
BOOL CAppRegistry::RemoveItem(LPCTSTR lpszSubItem) const
{
TCHAR atcPath[APPREG_MAXPATH];
if(lpszSubItem&&lpszSubItem[0]!=TCHAR(0))
::_stprintf(atcPath,_T("%s\\%s\\%s\\%s\\%s\\%s"),
m_atcRoot,
m_atcCom,
m_atcApp,
m_atcVer,
m_atcItem,
lpszSubItem);
else
::_stprintf(atcPath,_T("%s\\%s\\%s\\%s\\%s"),
m_atcRoot,
m_atcCom,
m_atcApp,
m_atcVer,
m_atcItem);
return deletekey(m_hRegRootKey,atcPath);
}
//删除当前版本的应用程序在注册表中的所有数据
//<参数>
//<返回值>
// 如果成功返回TRUE,否则返回FALSE。
// Remove将把系统注册表中
//“HKEY_LOCAL_MACHINE\根项\公司名称\应用程序名称\版本”
//项目下的所有数据都删除,包括“版本”项目本身。
BOOL CAppRegistry::Remove() const
{
TCHAR atcPath[APPREG_MAXPATH];
::_stprintf(atcPath,_T("%s\\%s\\%s\\%s"),
m_atcRoot,
m_atcCom,
m_atcApp,
m_atcVer);
return deletekey(m_hRegRootKey,atcPath);
}
//删除当前应用程序在注册表中各个版本的所有数据
//<参数>
//<返回值>
// 如果成功返回TRUE,否则返回FALSE。
// RemoveApp将把系统注册表中
//“HKEY_LOCAL_MACHINE\根项\公司名称\应用程序名称”
//项目下的所有数据都删除,包括“应用程序名称”项目本身。
BOOL CAppRegistry::RemoveApp() const
{
TCHAR atcPath[APPREG_MAXPATH];
::_stprintf(atcPath,_T("%s\\%s\\%s"),
m_atcRoot,
m_atcCom,
m_atcApp);
return deletekey(m_hRegRootKey,atcPath);
}
//删除注册表中所有由CAppRegistry对象生成的数据
//<参数>
//<返回值>
// 如果成功返回TRUE,否则返回FALSE。
// RemoveAll将把系统注册表中
//“HKEY_LOCAL_MACHINE\根项\公司名称”项目下的所
//有数据都删除,包括“公司名称”项目本身。
BOOL CAppRegistry::RemoveAll() const
{
TCHAR atcPath[APPREG_MAXPATH];
::_stprintf(atcPath,_T("%s\\%s"),
m_atcRoot,
m_atcCom);
return deletekey(m_hRegRootKey,atcPath);
}
//从注册表中删除指定项目
//<参数>
// hKey: 指定待删除项目所在的根键
// lpszSub: 以NULL结束的待删除项目的名称
//<返回值>
// 如果成功返回TRUE,否则返回FALSE。
// deletekey是一个对系统注册表有破坏性的函数,应该慎重使用。
//如果hKey是一个系统根键(如:HKEY_LOCAL_MACHINE),而lpszSub
//为""或者指定了一个系统项目(如:"SOFTWARE"),则deletekey将删除
//许多对整个系统至关重要的数据而导致操作系统崩溃。
inline BOOL CAppRegistry::deletekey(HKEY hKey, LPCTSTR lpszSub) const
{
BOOL bRet;
long lRetVal;
HKEY hSubKey;
lRetVal=::RegOpenKeyEx(hKey,APPREG_SAFESTRPTR(lpszSub),0,KEY_ALL_ACCESS,&hSubKey);
if(lRetVal==ERROR_SUCCESS)
{
FILETIME time ;
TCHAR atcSub[256] ;
DWORD dwSize=256 ;
bRet=TRUE;
//枚举当前项目下所有的子项目,并将找到的所有子项目删除
while(::RegEnumKeyEx(hSubKey,0,atcSub,&dwSize,NULL,NULL,NULL,&time)==ERROR_SUCCESS)
{
//递归调用deletekey
if(deletekey(hSubKey,atcSub)==FALSE)
{
::RegCloseKey(hSubKey) ;
bRet=FALSE;
break;
}
dwSize = 256 ;
}
} //if(lRetVal==ERROR_SUCCESS)
else
bRet=FALSE;
if(bRet==TRUE)
{
//删除项目,经过上面的循环枚举子项目和递归调用deletekey,hSubKey应该已经是
//一个没有任何下级子项目的项目了。
lRetVal=::RegDeleteKey(hSubKey,_T(""));
if(lRetVal!=ERROR_SUCCESS)
{
bRet=FALSE;
::RegCloseKey(hSubKey);
}
} //if(bRet==TRUE)
return bRet;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -