我正在使用 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_MACHINE\SOFTWARE\WOW6432Node
所以在你的情况下,这个密钥可能不存在于 WOW6432Node 中。 您可以在
KEY_WOW64_64KEY
中使用RegOpenKeyExW
:
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);
}
有关访问备用注册表视图的更多信息: