C++读取注册表的实现方法
来源:本站原创|时间:2020-01-10|栏目:C语言|点击: 次
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”
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章
- 04-02c语言没有round函数 round c语言
- 01-10深入理解C++中常见的关键字含义
- 01-10使用C++实现全排列算法的方法详解
- 01-10c++中inline的用法分析
- 01-10用C++实现DBSCAN聚类算法
- 01-10全排列算法的非递归实现与递归实现的方法(C++)
- 01-10C++大数模板(推荐)
- 01-10浅谈C/C++中的static与extern关键字的使用详解
- 01-10深入C/C++浮点数在内存中的存储方式详解
- 01-10深入理解C/C++混合编程
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-11ajax实现页面的局部加载
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 04-02jquery与jsp,用jquery
- 01-10delphi制作wav文件的方法
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10SublimeText编译C开发环境设置
- 01-10C#中split用法实例总结
- 01-10使用C语言求解扑克牌的顺子及n个骰子