C++讀取注冊表的實現(xiàn)方法
更新時間:2017年10月11日 15:07:08 作者:luoweifu
這篇文章主要介紹了C++讀取注冊表的實現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握實現(xiàn)這樣的功能,需要的朋友可以參考下
C++讀取注冊表
GetRegValue.h:
#ifndef __GETREGVALUE_H__ #define __GETREGVALUE_H__ #include <string> //--------------------------------------------------------------- //function: // GetRegValue 獲取注冊表中指定鍵的值 //Access: // public //Parameter: // [in] int nKeyType - 注冊表項的類型,傳入的參數(shù)只可能是以下數(shù)值: // 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:
{
//分配內(nèi)存大小
BYTE* lpValue = new BYTE[dwSize];
//獲取注冊表中指定的鍵所對應的值
LONG lRet = ::RegQueryValueEx(hKeyResult, wstrKey.c_str(), 0, &dwDataType, lpValue, &dwSize);
delete[] lpValue;
break;
}
case REG_SZ:
{
//分配內(nèi)存大小
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;
}
}
//關(guān)閉注冊表
::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;
}
結(jié)果:
strValue:
“ebd1360403764c9d48c585ef93a6eacbd89ded596f043f78e54eb0adeba7251d”

如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
深入理解C++中public、protected及private用法
這篇文章主要介紹了C++中public、protected及private用法,對于C++面向?qū)ο蟪绦蛟O計來說是非常重要的概念,需要的朋友可以參考下2014-08-08
c++實現(xiàn)單純形法現(xiàn)行規(guī)劃問題的求解(推薦)
這篇文章主要介紹了c++實現(xiàn)單純形法現(xiàn)行規(guī)劃問題的求解,本文針對問題通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
C++使用OpenCV實現(xiàn)證件照藍底換成白底功能(或其他顏色如紅色)詳解
這篇文章主要介紹了C++使用OpenCV實現(xiàn)證件照藍底換成白底功能(或其他顏色如紅色),結(jié)合實例形式詳細分析了OpenCV顏色轉(zhuǎn)換相關(guān)操作原理與實現(xiàn)技巧,需要的朋友可以參考下2019-12-12

