操作注册表的VC类CWzjRegOp(附类源码和示例代码)
/******************************************
* *
* 类名: CWzjRegOp 头文件 WzjRegOp.h *
* 描述: 注册表系列操作 *
* 信息: 汪自军 吉林大学 2007.11 *
* 联系: 3s_studio@163.com TM: 39600719 *
* 获取更多详细内容、帮助或交流请光临: *
* 3S工作室网站: http://www.3sstudio.cn *
* 3S工作室论坛: http://www.3sstudio.cn/bbs *
* *
*******************************************/
在VC中操作注册表项,包括子键的增加和删除,注册表项的增加或删除,以及注册表项值的读取、修改和查询等,虽然不算很难,但是操作注册瑶API函数中数据参数弄起来也挺麻烦的,为了方便大家操作注册表,只用一个函数就简简单单实现功能,3S工作室编写了操作注册表的类CWzjRegOp。
下面先介绍一下他的应用:
1,在你的VC工程中加入CWzjRegOp类(不会吧,不会,这个是基础的东西啦,就是把WzjRegOp.h和WzjRegOp.cpp拷到你的工程所在目录下<怕你放在别的地方移动了嘛>,然后通过VC菜单Project/Add to project/Files选择这两个文件,OK,看ClassView中,是不是多了一个CWzjRegOp类?就这么简单);
2,在你想要的地方使用这个类操作注册表
CWzjRegOp regOp; //定义一个注册表操作对象
CWzjRegOp::err e; //定义一个错误枚举变量,用来标识注册表操作结果
CString str; //查询得到的注册表项的值
//增加一个子键"SOFTWARE\\Microsoft\\TNDP"
e = regOp.AddSubKey((HKEY)regOp.DHKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\TNDP");
//判断不成功
if (e != CWzjRegOp::ERR_SUCCESS) {
MessageBox("创建子键失败");
return;
}
//设置识注册表项值
e = regOp.SetStrValue((HKEY)regOp.DHKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\TNDP", "CptNO", "76-198-46-121-44");
//当然错误信息还可以更加丰富
if (e == CWzjRegOp::ERR_OPENREGKEY){
MessageBox("打开主键键失败");
return;
}
else if (e == CWzjRegOp::ERR_SETREGVALUE){
MessageBox("设置注册表项值失败");
return;
}
//查询注册表项值
e = regOp.GetStrValue((HKEY)regOp.DHKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\TNDP", "CptNO", str);
再介绍他的头文件
class CWzjRegOp
{
public:
enum err
{
ERR_OPENREGKEY,
ERR_SETREGVALUE,
ERR_QUERYVALUE,
ERR_DELETEVALUE,
ERR_SUBKEYEXIST,
ERR_CREATESUBKEY,
ERR_DELETESUBKEY,
ERR_SUCCESS
};
enum hkey
{
DHKEY_CLASSES_ROOT = 0x80000000,
DHKEY_CURRENT_USER = 0x80000001,
DHKEY_LOCAL_MACHINE = 0x80000002,
DHKEY_USERS = 0x80000003,
DHKEY_CURRENT_CONFIG = 0x80000005
};
public:
CWzjRegOp();
virtual ~CWzjRegOp();
public:
//设置或修改注册表字符串类型值
err SetStrValue(HKEY hMainKey, CString szSubKey, CString szItem, CString szValue);
//查询得到注册表字符串类型值
err GetStrValue(HKEY hMainKey, CString szSubKey, CString szItem, CString& szValue);
//删除注册表中项
err DeleteStrValue(HKEY hMainKey, CString szSubKey, CString szItem);
//增加注册表子键
err AddSubKey(HKEY hMainKey, CString szSubKey);
//删除注册表子键
err DeleteSubKey(HKEY hMainKey, CString szSubKey);
};
总结一下这个类的特点:
1,错误采用类中枚举方式,有很强的提示功能,用这些值的时候CWzjRegOp::ERR_SUBKEYEXIST就行。
public:
enum err
{
ERR_OPENREGKEY,
ERR_SETREGVALUE,
ERR_QUERYVALUE,
ERR_DELETEVALUE,
ERR_SUBKEYEXIST,
ERR_CREATESUBKEY,
ERR_DELETESUBKEY,
ERR_SUCCESS
};
2,定义主键为类枚举类型,使用的时候直接转换(HKEY)CWzjRegOp::DHKEY_LOCAL_MACHINE,这种方式不需要用户记忆主键。
enum hkey
{
DHKEY_CLASSES_ROOT = 0x80000000,
DHKEY_CURRENT_USER = 0x80000001,
DHKEY_LOCAL_MACHINE = 0x80000002,
DHKEY_USERS = 0x80000003,
DHKEY_CURRENT_CONFIG = 0x80000005
};
下面是该给出类的实现了(构造函数就不要了吧,里面没东西啊)
CWzjRegOp::err CWzjRegOp::SetStrValue(HKEY hMainKey, CString szSubKey, CString szItem, CString szValue)
{
HKEY hRsltKey;
//=========================================打开注册表
long lRslt = RegOpenKey(hMainKey, szSubKey, &hRsltKey);
if (lRslt != ERROR_SUCCESS)
{
return this->ERR_OPENREGKEY;
}
//===================================设置注册表值
lRslt = RegSetValueEx(hRsltKey, szItem, NULL, REG_SZ,
LPBYTE(szValue.GetBuffer(szValue.GetLength())), szValue.GetLength());
if (lRslt != ERROR_SUCCESS)
{
return ERR_SETREGVALUE;
}
//============================================关闭注册表键
if (hMainKey)
{
RegCloseKey(hMainKey);
}
if (hRsltKey)
{
RegCloseKey(hRsltKey);
}
return ERR_SUCCESS;
}
CWzjRegOp::err CWzjRegOp::GetStrValue(HKEY hMainKey, CString szSubKey, CString szItem, CString& szValue)
{
HKEY hRsltKey;
//打开注册表
if (ERROR_SUCCESS != RegOpenKey(hMainKey, szSubKey, &hRsltKey))
{
return ERR_OPENREGKEY;
}
LPBYTE lpData = new BYTE[256];
DWORD dwType = REG_SZ;
DWORD dwNum = 256;
//查询注册表项值
long lRslt = RegQueryValueEx(hRsltKey, szItem, 0, &dwType, lpData, &dwNum);
if (lRslt != ERROR_SUCCESS)
{
return ERR_QUERYVALUE;
}
szValue = (CString)lpData;
//关闭打开的键
if (hMainKey)
{
RegCloseKey(hMainKey);
}
if (hRsltKey)
{
RegCloseKey(hRsltKey);
}
return ERR_SUCCESS;
}
CWzjRegOp::err CWzjRegOp::AddSubKey(HKEY hMainKey, CString szSubKey)
{
HKEY hRsltKey;
//================================判断要增加的注册表子键是否已存在
if (ERROR_SUCCESS == RegOpenKey(hMainKey, szSubKey, &hRsltKey))
{
return this->ERR_SUBKEYEXIST;
}
//==================================如果不存在,则增加此子键
long lRslt = RegCreateKey(hMainKey, szSubKey, &hRsltKey);
// long lCrtRslt = RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\WZJ", &hRsltKey);
if (lRslt != ERROR_SUCCESS)
{
return this->ERR_CREATESUBKEY;
}
//===============================关闭打开的注册表键句柄
if(hMainKey)
{
RegCloseKey(hMainKey);
}
if (hRsltKey)
{
RegCloseKey(hRsltKey);
}
return this->ERR_SUCCESS;
}
CWzjRegOp::err CWzjRegOp::DeleteStrValue(HKEY hMainKey, CString szSubKey, CString szItem)
{
HKEY hRsltKey;
//打开注册表
long lRslt = RegOpenKey(hMainKey, szSubKey, &hRsltKey);
if (lRslt != ERROR_SUCCESS)
{
return ERR_OPENREGKEY;
}
//删除注册表项
lRslt = RegDeleteValue(hRsltKey, szItem);
if (lRslt != ERROR_SUCCESS)
{
return ERR_DELETEVALUE;
}
return ERR_SUCCESS;
}
CWzjRegOp::err CWzjRegOp::DeleteSubKey(HKEY hMainKey, CString szSubKey)
{
//=================================删除子键
long lRslt = RegDeleteKey(hMainKey, szSubKey);
if (lRslt) {
return ERR_DELETESUBKEY;
}
//关闭打开的键
if (hMainKey)
{
RegCloseKey(hMainKey);
}
return ERR_SUCCESS;
}