javascript和JQuery焦点图和代码特效大全
当前最流行的开源CMS网站系统大全
当前位置:首页 > 编程开发 > C语言C++

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

来源:IT技术网编辑:雨天发布于:2017-10-12人围观

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和c++中实现函数回调

下一篇:没有了

与相关的文章
有时间的话来看看IT界的突发事件