如何从Windowsregistry中读取值

如何从Windowsregistry中读取值,第1张

概述如何从Windowsregistry中读取

给定一些registry值的关键(例如HKEY_LOCAL_MACHINE blah blah blah foo)我怎么能:

安全地确定这样的密钥存在。

以编程方式(即用代码)得到它的价值。

我绝对不打算把任何东西写回registry(在我的职业生涯期间,如果我可以帮助它的话)。 所以我们可以跳过关于我身体中每个分子以光速爆炸的讲座,如果我不正确地写入registry。

更喜欢C ++中的答案,但大多只需要知道什么特殊的windows API咒语得到的价值是。

WNetAddConnection2在UNIX上类似的方法

C ++控制台应用程序中的windows控制台光标符号/信号栏

为什么closuresudp套接字块?

衡量一个C ++代码的运行时间?

我如何维护C ++中的COM对象的弱引用?

如何从不存在的用户拥有的文件夹中删除ACL

发送IOCTL到windows设备驱动程序 – Createfile失败

UWP应用程序无法完全启动另一个UWP应用程序?

如何在c中正确使用scandir()?

一个有趣的事情与sprintf

这里是一些伪代码来检索以下内容:

如果注册表项存在

该注册表项的默认值是什么

什么是字符串值

什么是DWORD值

示例代码:

包含库依赖项:AdvAPI32.lib

HKEY hKey; LONG lRes = RegOpenKeyExW(HKEY_LOCAL_MACHINE,L"SOFTWARE\Perl",KEY_READ,&hKey); bool bExistsAndSuccess (lRes == ERROR_SUCCESS); bool bDoesNotExistsspecifically (lRes == ERROR_file_NOT_FOUND); std::wstring strValueOfBinDir; std::wstring strKeyDefaultValue; GetStringRegKey(hKey,L"BinDir",strValueOfBinDir,L"bad"); GetStringRegKey(hKey,L"",strKeyDefaultValue,L"bad"); LONG GetDWORDRegKey(HKEY hKey,const std::wstring &strValuename,DWORD &nValue,DWORD nDefaultValue) { nValue = nDefaultValue; DWORD DWBufferSize(sizeof(DWORD)); DWORD nResult(0); LONG nError = ::RegqueryValueExW(hKey,strValuename.c_str(),NulL,reinterpret_cast<LPBYTE>(&nResult),&DWBufferSize); if (ERROR_SUCCESS == nError) { nValue = nResult; } return nError; } LONG GetBoolRegKey(HKEY hKey,bool &bValue,bool bDefaultValue) { DWORD nDefValue((bDefaultValue) ? 1 : 0); DWORD nResult(nDefValue); LONG nError = GetDWORDRegKey(hKey,nResult,nDefValue); if (ERROR_SUCCESS == nError) { bValue = (nResult != 0) ? true : false; } return nError; } LONG GetStringRegKey(HKEY hKey,std::wstring &strValue,const std::wstring &strDefaultValue) { strValue = strDefaultValue; WCHAR szBuffer[512]; DWORD DWBufferSize = sizeof(szBuffer); ulONG nError; nError = RegqueryValueExW(hKey,(LPBYTE)szBuffer,&DWBufferSize); if (ERROR_SUCCESS == nError) { strValue = szBuffer; } return nError; }

const CString REG_SW_GROUP_I_WANT = _T("SOFTWARE\My Corporation\My Package\Group I want"); const CString REG_KEY_I_WANT= _T("Key name"); CRegKey regKey; DWORD DWValue = 0; if(ERROR_SUCCESS != regKey.Open(HKEY_LOCAL_MACHINE,REG_SW_GROUP_I_WANT)) { m_pobLogger->LogError(_T("CRegKey::Open Failed in Method")); regKey.Close(); goto Function_Exit; } if( ERROR_SUCCESS != regKey.queryValue( DWValue,REG_KEY_I_WANT)) { m_pobLogger->LogError(_T("CRegKey::queryValue Failed in Method")); regKey.Close(); goto Function_Exit; } // DWValue has the stuff Now - use for further processing

这对RegOpenKey和RegqueryKeyEx将做的伎俩。

如果使用MFC, CRegKey类更容易解决。

的RegqueryValueEx

如果该值存在,则给出该值,如果该密钥不存在则返回错误码ERROR_file_NOT_FOUND。

(我不知道我的链接是否工作,但如果你只是谷歌的“RegqueryValueEx”第一个命中是MSDN文件。)

#include <windows.h> #include <map> #include <string> #include <stdio.h> #include <string.h> #include <tr1/stdint.h> using namespace std; voID printerr(DWORD DWerror) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYstem | FORMAT_MESSAGE_IGnorE_INSERTS,DWerror,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAulT),// Default language (LPTSTR) &lpMsgBuf,NulL ); // Process any inserts in lpMsgBuf. // ... // display the string. if (isOut) { fprintf(fout,"%sn",lpMsgBuf); } else { printf("%sn",lpMsgBuf); } // Free the buffer. LocalFree(lpMsgBuf); } bool regreadSZ(string& hkey,string& subkey,string& value,string& returnvalue,string& regValueType) { char s[128000]; map<string,HKEY> keys; keys["HKEY_CLASSES_ROOT"]=HKEY_CLASSES_ROOT; keys["HKEY_CURRENT_CONfig"]=HKEY_CURRENT_CONfig; //DID NOT SURVIVE? keys["HKEY_CURRENT_USER"]=HKEY_CURRENT_USER; keys["HKEY_LOCAL_MACHINE"]=HKEY_LOCAL_MACHINE; keys["HKEY_USERS"]=HKEY_USERS; HKEY mykey; map<string,DWORD> valuetypes; valuetypes["REG_SZ"]=REG_SZ; valuetypes["REG_EXPAND_SZ"]=REG_EXPAND_SZ; valuetypes["REG_MulTI_SZ"]=REG_MulTI_SZ; //probably can't use this. LONG retval=RegOpenKeyEx( keys[hkey],// handle to open key subkey.c_str(),// subkey name 0,// reserved KEY_READ,// security access mask &mykey // handle to open key ); if (ERROR_SUCCESS != retval) {printerr(retval); return false;} DWORD slen=128000; DWORD valuetype = valuetypes[regValueType]; retval=RegqueryValueEx( mykey,// handle to key value.c_str(),// value name NulL,// reserved (LPDWORD) &valuetype,// type buffer (LPBYTE)s,// data buffer (LPDWORD) &slen // size of data buffer ); switch(retval) { case ERROR_SUCCESS: //if (isOut) { // fprintf(fout,"RegqueryValueEx():ERROR_SUCCESS:succeeded.n"); //} else { // printf("RegqueryValueEx():ERROR_SUCCESS:succeeded.n"); //} break; case ERROR_MORE_DATA: //what do I do Now? data buffer is too small. if (isOut) { fprintf(fout,"RegqueryValueEx():ERROR_MORE_DATA: need bigger buffer.n"); } else { printf("RegqueryValueEx():ERROR_MORE_DATA: need bigger buffer.n"); } return false; case ERROR_file_NOT_FOUND: if (isOut) { fprintf(fout,"RegqueryValueEx():ERROR_file_NOT_FOUND: registry value does not exist.n"); } else { printf("RegqueryValueEx():ERROR_file_NOT_FOUND: registry value does not exist.n"); } return false; default: if (isOut) { fprintf(fout,"RegqueryValueEx():unkNown error type 0x%lx.n",retval); } else { printf("RegqueryValueEx():unkNown error type 0x%lx.n",retval); } return false; } retval=RegCloseKey(mykey); if (ERROR_SUCCESS != retval) {printerr(retval); return false;} returnvalue = s; return true; }

总结

以上是内存溢出为你收集整理的如何从Windowsregistry中读取值全部内容,希望文章能够帮你解决如何从Windowsregistry中读取值所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1289062.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存