SHGetValueW 为 x64 和 x86 返回不同的值

问题描述 投票:0回答:1

我正在使用 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 应用程序读取值?

c++ windows winapi registry
1个回答
0
投票

对于在 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);
 
}

有关访问备用注册表视图的更多信息

© www.soinside.com 2019 - 2024. All rights reserved.