服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++读取注册表的实现方法

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

2021-06-06 16:18luoweifu C/C++

这篇文章主要介绍了C++读取注册表的实现方法的相关资料,希望通过本文能帮助到大家,让大家理解掌握实现这样的功能,需要的朋友可以参考下

C++读取注册表

GetRegValue.h:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#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;
}

测试代码:

?
1
2
3
4
5
6
7
8
9
#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++读取注册表的实现方法

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

原文链接:http://blog.csdn.net/luoweifu/article/details/47175959

延伸 · 阅读

精彩推荐