Считать значение реестра 32 бит?

У меня есть следующий код, который компилируется для 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-битных компьютерах?
  • Как я могу поместить возврат в простую строку? ех; строка namevalue = GetRegistry (_T («name»));

0

Решение

Вам нужно использовать 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 будет разрешать SOFTWARE\Wow6432Node\PAX в 64-битной системе.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]