C++讀取注冊(cè)表的實(shí)現(xiàn)方法
C++讀取注冊(cè)表
GetRegValue.h:
#ifndef __GETREGVALUE_H__ #define __GETREGVALUE_H__ #include <string> //--------------------------------------------------------------- //function: // GetRegValue 獲取注冊(cè)表中指定鍵的值 //Access: // public //Parameter: // [in] int nKeyType - 注冊(cè)表項(xiàng)的類型,傳入的參數(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; } } //打開注冊(cè)表 if(ERROR_SUCCESS == ::RegOpenKeyEx(hKey, wstrUrl.c_str(), 0, KEY_QUERY_VALUE, &hKeyResult)) { // 獲取緩存的長(zhǎng)度dwSize及類型dwDataType ::RegQueryValueEx(hKeyResult, wstrKey.c_str(), 0, &dwDataType, NULL, &dwSize); switch (dwDataType) { case REG_MULTI_SZ: { //分配內(nèi)存大小 BYTE* lpValue = new BYTE[dwSize]; //獲取注冊(cè)表中指定的鍵所對(duì)應(yīng)的值 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)); //獲取注冊(cè)表中指定的鍵所對(duì)應(yīng)的值 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)閉注冊(cè)表 ::RegCloseKey(hKeyResult); return strValue; }
測(cè)試代碼:
#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ǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
深入理解C++中public、protected及private用法
這篇文章主要介紹了C++中public、protected及private用法,對(duì)于C++面向?qū)ο蟪绦蛟O(shè)計(jì)來說是非常重要的概念,需要的朋友可以參考下2014-08-08Qt實(shí)現(xiàn)模糊匹配功能的實(shí)例詳解
對(duì)于瀏覽器的使用,我想大家一定不會(huì)陌生吧,輸入要搜索的內(nèi)容時(shí),會(huì)出現(xiàn)相應(yīng)的匹配信息。本文就來用Qt實(shí)現(xiàn)模糊匹配功能,感興趣的可以了解一下2022-10-10c++實(shí)現(xiàn)單純形法現(xiàn)行規(guī)劃問題的求解(推薦)
這篇文章主要介紹了c++實(shí)現(xiàn)單純形法現(xiàn)行規(guī)劃問題的求解,本文針對(duì)問題通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04VC實(shí)現(xiàn)的病毒專殺工具完整實(shí)例
這篇文章主要介紹了VC實(shí)現(xiàn)的病毒專殺工具完整實(shí)例,詳細(xì)講述了針對(duì)病毒的進(jìn)程終止、刪除文件及回復(fù)注冊(cè)表與啟動(dòng)項(xiàng)等,同時(shí)介紹了與之相關(guān)的系統(tǒng)函數(shù),非常具有參考借鑒價(jià)值,需要的朋友可以參考下2014-10-10C++使用OpenCV實(shí)現(xiàn)證件照藍(lán)底換成白底功能(或其他顏色如紅色)詳解
這篇文章主要介紹了C++使用OpenCV實(shí)現(xiàn)證件照藍(lán)底換成白底功能(或其他顏色如紅色),結(jié)合實(shí)例形式詳細(xì)分析了OpenCV顏色轉(zhuǎn)換相關(guān)操作原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-12-12