读取注册表值32位
Read registry value 32 bit?
我有以下为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位计算机
- 如何将返回值放在一个简单的字符串中?ex;string namevalue=GetRegistry(_T("name"))
您需要将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位注册表,因此SOFTWAREPAX
将在64位系统上解析为SOFTWAREWow6432NodePAX
。
相关文章:
- 将应用程序从32位移植到64位时出现问题
- 有没有任务栏API可以立即应用注册表更改
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 检查注册表项是否链接到(或副本)另一个注册表项
- qmake:检测目标位宽(32 位或 64 位)
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- 浮点数为 32 位和 64 位二进制表示形式
- C++易失性:保证 32 位访问?
- 禁用地址共享注册表不起作用
- 如何从注册表项中提取配置单元和注册表名称
- 注册表正在设置 1 个字符
- 清理"QSettings"注册表项的最佳方法(Windows上的Qt 5)
- 在 c++ 中编辑注册表项
- 在 64 位和 32 位窗口中读取注册表
- 如何在C 中为Windows注册表写32位D字
- 如何在不同的目标平台上以编程方式智能注册 32 位 COM/DLL 组件
- 在C/C++中计算一个32位CRC查找表
- 32位和64位Windows上的注册表
- 读取注册表值32位
- 在32位win7中运行msi导致“模块注册失败”,但在64位win7中工作