📄 appregistry.cpp
字号:
// AppRegistry.cpp: implementation of the CAppRegistry class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "AppRegistry.h"
#include "stdio.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CAppRegistry::CAppRegistry()
{
m_hRegRootKey=APPREG_DEFROOTKEY;
::_stprintf(m_atcRoot,APPREG_DEFROOTITEM);
::_stprintf(m_atcCom,_T("Unknown Company"));
::_stprintf(m_atcApp,_T("Unknown Application"));
::_stprintf(m_atcVer,_T("Unknown Version"));
::_stprintf(m_atcItem,_T("Unknown Item"));
}
CAppRegistry::CAppRegistry(LPCTSTR lpszCom, //公司名称
LPCTSTR lpszApp, //应用程序名称
LPCTSTR lpszVer, //应用程序版本
LPCTSTR lpszItem) //项目名称
{
m_hRegRootKey=APPREG_DEFROOTKEY;
::_stprintf(m_atcRoot,APPREG_DEFROOTITEM);
::_stprintf(m_atcCom,APPREG_SAFESTRPTR(lpszCom));
::_stprintf(m_atcApp,APPREG_SAFESTRPTR(lpszApp));
::_stprintf(m_atcVer,APPREG_SAFESTRPTR(lpszVer));
::_stprintf(m_atcItem,APPREG_SAFESTRPTR(lpszItem));
}
CAppRegistry::~CAppRegistry()
{
}
//设置应用程序注册表对象的公司名称
//<参数>
// lpszCompany: 以NULL结束的公司名称字符串
//<返回值>
// 返回lpszCompany的长度。
int CAppRegistry::SetCompany(LPCTSTR lpszCompany)
{
::lstrcpy(m_atcCom,APPREG_SAFESTRPTR(lpszCompany));
return ::lstrlen(m_atcCom);
}
//获取应用程序注册表对象的公司名称
//<参数>
//<返回值>
// 返回应用程序注册表对象的公司名称。
LPCTSTR CAppRegistry::GetCompany() const
{
return m_atcCom;
}
//设置应用程序注册表对象的应用程序名称
//<参数>
// lpszApp: 以NULL结束的应用程序名称字符串
//<返回值>
// 返回lpszApp的长度。
int CAppRegistry::SetApplication(LPCTSTR lpszApp)
{
::lstrcpy(m_atcApp,APPREG_SAFESTRPTR(lpszApp));
return ::lstrlen(m_atcApp);
}
//获取应用程序注册表对象的应用程序名称
//<参数>
//<返回值>
// 返回应用程序注册表对象的应用程序名称。
LPCTSTR CAppRegistry::GetApplication() const
{
return m_atcApp;
}
//设置应用程序注册表对象的版本
//<参数>
// lpszVersion: 以NULL结束的版本字符串
//<返回值>
// 返回lpszVersion的长度。
int CAppRegistry::SetVersion(LPCTSTR lpszVersion)
{
::lstrcpy(m_atcVer,APPREG_SAFESTRPTR(lpszVersion));
return ::lstrlen(m_atcVer);
}
//获取应用程序注册表对象的版本
//<参数>
//<返回值>
// 返回应用程序注册表对象的版本字符串。
LPCTSTR CAppRegistry::GetVersion() const
{
return m_atcVer;
}
//设置应用程序注册表对象的项目名称
//<参数>
// lpszItem: 以NULL结束的项目名称字符串
//<返回值>
// 返回lpszItem的长度。
int CAppRegistry::SetItem(LPCTSTR lpszItem)
{
::lstrcpy(m_atcItem,APPREG_SAFESTRPTR(lpszItem));
return ::lstrlen(m_atcItem);
}
//获取应用程序注册表对象的项目名称
//<参数>
//<返回值>
// 返回应用程序注册表对象的项目名称。
LPCTSTR CAppRegistry::GetItem() const
{
return m_atcItem;
}
//设置应用程序注册表对象的根项名称,根项缺省为“SOFTWARE”
//<参数>
// lpszRoot: 以NULL结束的根项名称字符串
//<返回值>
// 返回lpszRoot的长度。
int CAppRegistry::SetRoot(LPCTSTR lpszRoot)
{
::lstrcpy(m_atcRoot,APPREG_SAFESTRPTR(lpszRoot));
return ::lstrlen(m_atcRoot);
}
//获取应用程序注册表对象的根项名称,根项缺省为“SOFTWARE”
//<参数>
//<返回值>
// 返回应用程序注册表对象的根项名称。
LPCTSTR CAppRegistry::GetRoot() const
{
return m_atcRoot;
}
//在注册表中保存一个long值
//<参数>
// lpszSubItem: 以NULL结束的子项目名称字符串
// lpszName: 以NULL结束的long值名称字符串
// liVal: 要保存的long值
//<返回值>
// 如果成功返回TRUE,否则返回FALSE。
// lVal将被保存在系统注册表的
//“HKEY_LOCAL_MACHINE\根项\公司名称\应用程序名称\版本\项目\子项目\long值名称”
//位置。
BOOL CAppRegistry::SetRegLong(LPCTSTR lpszSubItem, LPCTSTR lpszName, long lVal) const
{
if(::lstrlen(APPREG_SAFESTRPTR(lpszSubItem))>=APPREG_MAXSUBITEM)
return FALSE;
if(::lstrlen(APPREG_SAFESTRPTR(lpszName))>=APPREG_MAXNAME)
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)
{
//将long值以DWORD的形式保存到注册表中
lRetVal=::RegSetValueEx(hRegKey,APPREG_SAFESTRPTR(lpszName),0,REG_DWORD,LPBYTE(&lVal),sizeof(lVal));
if(lRetVal==ERROR_SUCCESS)
bRet=TRUE;
else
bRet=FALSE;
::RegCloseKey(hRegKey);
} //if(lRetVal==ERROR_SUCCESS)
else
bRet=FALSE;
return bRet;
}
//在注册表中读取一个long值
//<参数>
// lpszSubItem: 以NULL结束的子项目名称字符串
// lpszName: 以NULL结束的long值名称字符串
// rlVal: 用来long值的变量的引用
//<返回值>
// 如果成功返回TRUE,否则返回FALSE。
// GetRegLong将从系统注册表的
//“HKEY_LOCAL_MACHINE\根项\公司名称\应用程序名称\版本\项目\子项目\long值名称”
//处读取一个long值。
BOOL CAppRegistry::GetRegLong(LPCTSTR lpszSubItem, LPCTSTR lpszName, long &rlVal) const
{
if(::lstrlen(APPREG_SAFESTRPTR(lpszSubItem))>=APPREG_MAXSUBITEM)
return FALSE;
if(::lstrlen(APPREG_SAFESTRPTR(lpszName))>=APPREG_MAXNAME)
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)
{
DWORD dwType,dwDataSize,dwData;
lRetVal=::RegQueryValueEx(hRegKey,APPREG_SAFESTRPTR(lpszName),NULL,&dwType,NULL,&dwDataSize);
//如果查询类型成功,并且查询到的类型是DWORD型
if(lRetVal==ERROR_SUCCESS&&dwType==REG_DWORD)
{
//读取一个DWORD数据
lRetVal=::RegQueryValueEx(hRegKey,APPREG_SAFESTRPTR(lpszName),NULL,&dwType,LPBYTE(&dwData),&dwDataSize);
if(lRetVal==ERROR_SUCCESS&&dwType==REG_DWORD)
{
bRet=TRUE;
rlVal=long(dwData);
}
else
bRet=FALSE;
}
else
bRet=FALSE;
::RegCloseKey(hRegKey);
} //if(lRetVal==ERROR_SUCCESS)
else
bRet=FALSE;
return bRet;
}
//在注册表中保存一个字符串
//<参数>
// lpszSubItem: 以NULL结束的子项目名称字符串
// lpszName: 以NULL结束的int值名称字符串
// lpszString: 要保存的字符串
//<返回值>
// 如果成功返回TRUE,否则返回FALSE。
// lpszString将被保存在系统注册表的
//“HKEY_LOCAL_MACHINE\根项\公司名称\应用程序名称\版本\项目\子项目\字符串值名称”
//位置。
BOOL CAppRegistry::SetRegString(LPCTSTR lpszSubItem, LPCTSTR lpszName, LPCTSTR lpszString) const
{
if(::lstrlen(APPREG_SAFESTRPTR(lpszSubItem))>=APPREG_MAXSUBITEM)
return FALSE;
if(::lstrlen(APPREG_SAFESTRPTR(lpszName))>=APPREG_MAXNAME)
return FALSE;
if(lpszString==NULL)
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_SZ,LPBYTE(APPREG_SAFESTRPTR(lpszString)),(::lstrlen(APPREG_SAFESTRPTR(lpszString))+1)*sizeof(lpszString[0]));
if(lRetVal==ERROR_SUCCESS)
bRet=TRUE;
else
bRet=FALSE;
::RegCloseKey(hRegKey);
}
else
bRet=FALSE;
return bRet;
}
//在注册表中读取指定字符串的长度
//<参数>
// lpszSubItem: 以NULL结束的子项目名称字符串
// lpszName: 以NULL结束的int值名称字符串
//<返回值>
// 如果失败返回-1,否则返回指定字符串的长度(包括NULL字符)
// GetRegStringSize将返回在系统注册表的
//“HKEY_LOCAL_MACHINE\根项\公司名称\应用程序名称\版本\项目\子项目\字符串值名称”
//位置的字符串的长度。
int CAppRegistry::GetRegStringSize(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_SZ)
iRet=int(dwDataSize/sizeof(TCHAR)); //将字节长度转换为字符长度
else
iRet=-1;
::RegCloseKey(hRegKey);
}
else
iRet=-1;
return iRet;
}
//在注册表中读取一个字符串
//<参数>
// lpszSubItem: 以NULL结束的子项目名称字符串
// lpszName: 以NULL结束的int值名称字符串
// lpBuff: 指向用于存放字符串的缓冲区
// iMaxStr: lpBuff所指缓冲区的容量
//<返回值>
// 如果成功返回TRUE,否则返回FALSE。
// GetRegString将从系统注册表的
//“HKEY_LOCAL_MACHINE\根项\公司名称\应用程序名称\版本\项目\子项目\字符串值名称”
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -