数码控科技猎奇Iphone动漫星座游戏电竞lolcosplay王者荣耀攻略allcnewsBLOGNEWSBLOGASKBLOGBLOGZSK全部技术问答问答技术问答it问答代码软件新闻开发博客电脑/网络手机/数码笔记本电脑互联网操作系统软件硬件编程开发360产品资源分享电脑知识文档中心IT全部全部分类全部分类技术牛文全部分类教程最新网页制作cms教程平面设计媒体动画操作系统网站运营网络安全服务器教程数据库工具网络安全软件教学vbscript正则表达式javascript批处理更多»编程更新教程更新游戏更新allitnewsJava新闻网络医疗信息化安全创业站长电商科技访谈域名会议专栏创业动态融资创投创业学院 / 产品经理创业公司人物访谈营销开发数据库服务器系统虚拟化云计算嵌入式移动开发作业作业1常见软件all电脑网络手机数码生活游戏体育运动明星影音休闲爱好文化艺术社会民生教育科学医疗健康金融管理情感社交地区其他电脑互联网软件硬件编程开发360相关产品手机平板其他电子产品摄影器材360硬件通讯智能设备购物时尚生活常识美容塑身服装服饰出行旅游交通汽车购房置业家居装修美食烹饪单机电脑游戏网页游戏电视游戏桌游棋牌游戏手机游戏小游戏掌机游戏客户端游戏集体游戏其他游戏体育赛事篮球足球其他运动球类运动赛车健身运动运动用品影视娱乐人物音乐动漫摄影摄像收藏宠物幽默搞笑起名花鸟鱼虫茶艺彩票星座占卜书画美术舞蹈小说图书器乐声乐小品相声戏剧戏曲手工艺品历史话题时事政治就业职场军事国防节日风俗法律法规宗教礼仪礼节自然灾害360维权社会人物升学入学人文社科外语资格考试公务员留学出国家庭教育学习方法语文物理生物工程学农业数学化学健康知识心理健康孕育早教内科外科妇产科儿科皮肤科五官科男科整形中医药品传染科其他疾病医院两性肿瘤科创业投资企业管理财务税务银行股票金融理财基金债券保险贸易商务文书国民经济爱情婚姻家庭烦恼北京上海重庆天津黑龙江吉林辽宁河北内蒙古山西陕西宁夏甘肃青海新疆西藏四川贵州云南河南湖北湖南山东江苏浙江安徽江西福建广东广西海南香港澳门台湾海外地区

C++读取注册表的实现方法

来源:脚本之家  责任编辑:小易  时间:2018/2/7 14:33:01

C++读取注册表

GetRegValue.h:

#ifndef __GETREGVALUE_H__
#define __GETREGVALUE_H__

#include <string>

//---------------------------------------------------------------
//function: 
//     GetRegValue 获取注册表中指定键的值
//Access:
//      public 
//Parameter:
//     [in] int nKeyType - 注册表项的类型,传入的参数只可能是以下数值:
//               0:HKEY_CLASSES_ROOT
//               1:HKEY_CURRENT_USER
//               2:HKEY_LOCAL_MACHINE
//               3:HKEY_USERS
//               4:HKEY_PERFORMANCE_DATA
//               5:HKEY_CURRENT_CONFIG
//               6:HKEY_DYN_DATA
//               7:HKEY_CURRENT_USER_LOCAL_SETTINGS
//               8:HKEY_PERFORMANCE_TEXT
//               9:HKEY_PERFORMANCE_NLSTEXT
//     [in] const std::string & strUrl - 要查找 的键的路径
//     [in] const std::string & strKey - 指定的键
//Returns:
//     std::string - 指定键的值
//Remarks:
//     ...
//author:  luoweifu
//---------------------------------------------------------------
std::string GetRegValue(int nKeyType, const std::string& strUrl, const std::string& strKey);

//可移植版本 wstring => string
std::string ws2s(const std::wstring& ws);

//可移植版本 string => wstring
std::wstring s2ws(const std::string& s);


#endif //__GETREGVALUE_H__

GetRegValue.cpp

#include "stdafx.h"
#include <Windows.h>
#include "GetRegValue.h"

//可移植版本 wstring => string
std::string ws2s(const std::wstring& ws)
{
  std::string curLocale = setlocale(LC_ALL, "");
  const wchar_t* _Source = ws.c_str();
  size_t _Dsize = wcstombs(NULL, _Source, 0) + 1;
  char *_Dest = new char[_Dsize];
  memset(_Dest,0,_Dsize);
  wcstombs(_Dest,_Source,_Dsize);
  std::string result = _Dest;
  delete []_Dest;
  setlocale(LC_ALL, curLocale.c_str());
  return result;
}

//可移植版本 string => wstring
std::wstring s2ws(const std::string& s)
{
  std::string curLocale = setlocale(LC_ALL, ""); 
  const char* _Source = s.c_str();
  size_t _Dsize = mbstowcs(NULL, _Source, 0) + 1;
  wchar_t *_Dest = new wchar_t[_Dsize];
  wmemset(_Dest, 0, _Dsize);
  mbstowcs(_Dest,_Source,_Dsize);
  std::wstring result = _Dest;
  delete []_Dest;
  setlocale(LC_ALL, curLocale.c_str());
  return result;
}

std::string GetRegValue(int nKeyType, const std::string& strUrl, const std::string& strKey)
{
  std::string strValue("");
  HKEY hKey = NULL;
  HKEY hKeyResult = NULL;
  DWORD dwSize   = 0;
  DWORD dwDataType = 0;
  std::wstring wstrUrl = s2ws(strUrl);
  std::wstring wstrKey = s2ws(strKey);

  switch(nKeyType)
  {
  case 0:
    {
      hKey = HKEY_CLASSES_ROOT;
      break;
    }
  case 1:
    {
      hKey = HKEY_CURRENT_USER;
      break;
    }
  case 2:
    {
      hKey = HKEY_LOCAL_MACHINE;
      break;
    }
  case 3:
    {
      hKey = HKEY_USERS;
      break;
    }
  case 4:
    {
      hKey = HKEY_PERFORMANCE_DATA;
      break;
    }
  case 5:
    {
      hKey = HKEY_CURRENT_CONFIG;
      break;
    }
  case 6:
    {
      hKey = HKEY_DYN_DATA;
      break;
    }
  case 7:
    {
      hKey = HKEY_CURRENT_USER_LOCAL_SETTINGS;
      break;
    }
  case 8:
    {
      hKey = HKEY_PERFORMANCE_TEXT;
      break;
    }
  case 9:
    {
      hKey = HKEY_PERFORMANCE_NLSTEXT;
      break;
    }
  default:
    {
      return strValue;
    }
  }

  //打开注册表
  if(ERROR_SUCCESS == ::RegOpenKeyEx(hKey, wstrUrl.c_str(), 0, KEY_QUERY_VALUE, &hKeyResult))
  {
    // 获取缓存的长度dwSize及类型dwDataType
    ::RegQueryValueEx(hKeyResult, wstrKey.c_str(), 0, &dwDataType, NULL, &dwSize); 
    switch (dwDataType)
    {
    case REG_MULTI_SZ:
      {
        //分配内存大小
        BYTE* lpValue = new BYTE[dwSize];
        //获取注册表中指定的键所对应的值
        LONG lRet = ::RegQueryValueEx(hKeyResult, wstrKey.c_str(), 0, &dwDataType, lpValue, &dwSize);
        delete[] lpValue;
        break;
      }
    case REG_SZ:
      {
        //分配内存大小
        wchar_t* lpValue = new wchar_t[dwSize];
        memset(lpValue, 0, dwSize * sizeof(wchar_t));
        //获取注册表中指定的键所对应的值
        if (ERROR_SUCCESS == ::RegQueryValueEx(hKeyResult, wstrKey.c_str(), 0, &dwDataType, (LPBYTE)lpValue, &dwSize))
        {
          std::wstring wstrValue(lpValue);
          strValue = ws2s(wstrValue);
        }
        delete[] lpValue;
        break;
      }
    default:
      break;
    }
  }

  //关闭注册表
  ::RegCloseKey(hKeyResult);


  return strValue;
}

测试代码:

#include "stdafx.h"
#include <string>
#include "GetRegValue.h"

int _tmain(int argc, _TCHAR* argv[])
{
  std::string strValue = GetRegValue(2, "SOFTWARE\\360Safe\\Liveup", "mid");
  return 0;
}

结果:

strValue:

“ebd1360403764c9d48c585ef93a6eacbd89ded596f043f78e54eb0adeba7251d”

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

您可能感兴趣的文章:


  • 本文相关:
  • c++访问注册表获取已安装软件信息列表示例代码
  • c++写注册表项实例
  • vc++实现文件与应用程序关联的方法(注册表修改)
  • c++ 写注册表方式让程序开机自启动
  • c++中拷贝构造函数的参数类型必须是引用
  • c++
  • 拷贝构造函数
  • 参数类型
  • c/c++中可变参数的用法详细解析
  • c
  • 可变参数
  • c语言可变参数实现示例
  • c语言
  • 可变参数
  • 使用root权限运行自己所编译程序的解决方法
  • root权限
  • linux使用gcc编译c语言共享库步骤
  • gcc
  • 共享库
  • c语言实现查看进程是否存在的方法示例
  • c语言
  • 进程
  • 详解c++编程中类的成员变量和成员函数的相关知识
  • c++
  • 成员变量
  • 成员函数
  • 使用opencv实现检测和追踪车辆
  • opencv
  • 追踪
  • 深入解析c++的wndclass结构体及其在windows中的应用
  • c++
  • windows
  • c++类构造函数详解
  • c++
  • 构造函数
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved