欢迎您来到GIS动力

加入收藏 免费注册 用户登陆 帮助中心
首页 新闻动态 技术专栏 银杏树下 学习考研 软件下载 求职招聘 许愿瓶 节日祝福 用户中心 精彩推荐 资源搜索 地图
专栏导航: AO开发 | SO开发 | ArcGIS桌面 | 超图桌面 | 开发语言 | 数据库 | WebGIS | 银杏文学 | 研究生考题 | FreeMap 谈天说地
   您现在位于: 首页技术专栏开发语言 → 正文
VC操作注册表类源码
07-12-20 00:00:00 作者:3s_studio 出处:3s_studio

操作注册表的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;
}


(本文已被浏览 次)
发布人:admin
推荐给好友:发送给好友
上篇新闻:
下篇新闻:
相关评论
发表我的评论
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  •   相关文章  
    无相关新闻

    关于我们 友情链接 ┋ 与我在线 ┋ 管理 ┋ TOP
    网站当前版本:GisPower CMS V3.0
    『GIS 动力』- http://www.gispower.org/
    联系我们:webmaster#gispower.org
    Copyright (c) 2003-2007 GisPOwer.Org. All Rights Reserved.

                   滇ICP备05006901号