У меня есть следующий код, который компилируется для 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);
}
Вам нужно использовать 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-битной системе.
Других решений пока нет …