我正在使用SHGetValueW API读取注册表值。
WCHAR activePolicyCode[512UL] = { 0 };
DWORD dwSize = sizeof(activePolicyCode);
DWORD type;
LSTATUS ret = SHGetValueW(HKEY_LOCAL_MACHINE, L"SOFTWARE\Microsoft\Windows\CurrentVersion\DeviceAccess", L"ActivePolicyCode", &type, &activePolicyCode, &dwSize);
对于x64,它返回0 - ERROR_SUCCESS
但是对于x86,它返回2 - ERROR_FILE_NOT_FOUND
为什么在行为上有差异?如何从x86应用程序读取值?
对于在64位系统上运行的32位应用程序,注册表函数被重定向到WOW6432Node
。所以如果你查询HKEY_LOCAL_MACHINE
hKey,你会得到以下值:
HKEY_LOCAL_MACHINESOFTWAREWOW6432Node
所以在您的情况下,这个键可能在WOW6432Node中不存在。在RegOpenKeyExW
KEY_WOW64_64KEY
HKEY hKey=0;
DWORD dwType=0;
BYTE pbData[1024];
DWORD dwDataSize = sizeof(pbData);
LSTATUS lStatus = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\Microsoft\Windows\CurrentVersion\DeviceAccess", 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
if (lStatus == ERROR_SUCCESS) {
lStatus = SHGetValueW(hKey, L"SOFTWARE\Microsoft\Windows\CurrentVersion\DeviceAccess", L"ActivePolicyCode", &dwType, pbData, &dwDataSize);
// Close the registry key
RegCloseKey(hKey);
}
关于访问备用注册表视图的更多信息: