gpt4 book ai didi

c++ - 读取注册表值 32 位?

转载 作者:行者123 更新时间:2023-11-28 06:56:34 25 4
gpt4 key购买 nike

我有以下为 MBCS 编译的代码。

CString GetRegistry(LPCTSTR pszValueName)
{
// Try open registry key
HKEY hKey = NULL;
LPCTSTR pszSubkey = _T("SOFTWARE\\Wow6432Node\\PAX");
if ( RegOpenKey(HKEY_LOCAL_MACHINE, pszSubkey, &hKey) != ERROR_SUCCESS )
{
// Error:
// throw an exception or something...
//
// (In production code a custom C++ exception
// derived from std::runtime_error could be used)
AtlThrowLastWin32();
}

// Buffer to store string read from registry
TCHAR szValue[1024];
DWORD cbValueLength = sizeof(szValue);

// Query string value
if ( RegQueryValueEx(
hKey,
pszValueName,
NULL,
NULL,
reinterpret_cast<LPBYTE>(&szValue),
&cbValueLength)
!= ERROR_SUCCESS )
{
// Error
// throw an exception or something...
AtlThrowLastWin32();
}

// Create a CString from the value buffer
return CString(szValue);
}
  • 如何使代码也适用于 32 位计算机?
  • 如何将返回值放入一个简单的字符串中?前任;字符串名称值 = GetRegistry(_T("名称"));

最佳答案

您需要将 RegOpenKeyEx()KEY_WOW64_32KEY 标志一起使用,并让它为您处理 Wow6432 节点,例如:

CString GetRegistry(LPCTSTR pszValueName)
{
// WOW64 access
REGSAM Wow64Flag;
#ifdef _WIN64
Wow64Flag = KEY_WOW64_32KEY;
#else
Wow64Flag = 0;
#endif

// Try open registry key
HKEY hKey = NULL;

LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\PAX"), 0, KEY_QUERY_VALUE | Wow64Flag, &hKey);
if ( lResult != ERROR_SUCCESS )
{
// Error:
// throw an exception or something...
//
// (In production code a custom C++ exception
// derived from std::runtime_error could be used)
SetLastError(lResult);
AtlThrowLastWin32();
}

DWORD cbValueLength;

// Query string value size
lResult = RegQueryValueEx(
hKey,
pszValueName,
NULL,
NULL,
NULL,
&cbValueLength)
!= ERROR_SUCCESS )
{
// Error
RegCloseKey(hKey);
// throw an exception or something...
SetLastError(lResult);
AtlThrowLastWin32();
}

// Buffer to return string read from registry
CString sValue;

if ( cbValueLength > 0 )
{
// Buffer to store string read from registry
std::vector<TCHAR> szValue((cbValueLength / sizeof(TCHAR))+1);

lResult = RegQueryValueEx(
hKey,
pszValueName,
NULL,
NULL,
reinterpret_cast<LPBYTE>(&szValue[0]),
&cbValueLength)
!= ERROR_SUCCESS )
{
// Error
RegCloseKey(hKey);
// throw an exception or something...
SetLastError(lResult);
AtlThrowLastWin32();
}

szValue[cbValueLength / sizeof(TCHAR)] = 0;
sValue = &szValue[0];
}

RegCloseKey(hKey);

return sValue;
}

当 64 位进程指定 KEY_WOW64_32KEY 或 32 位进程未指定任何 WOW64 标志时,它将访问 32 位注册表,因此 SOFTWARE\PAX 将解析到 64 位系统上的 SOFTWARE\Wow6432Node\PAX

关于c++ - 读取注册表值 32 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23097226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com