Я использую API SHGetValueW для чтения значения реестра.
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?
Есть два разных реестра
Нет двух разных реестров. Некоторые ключи перенаправляются и имеют разные 32- и 64-битные представления.
@DavidHeffernan: Абстракция в том, что есть два разных реестра. Реализация такова, что один из них хранится внутри ветки "WOW64Node" другого.
@BenVoigt Я хочу сказать, что абстракция применяется только к подмножеству реестра. Например, это не применяется в HKCU.
@DavidHeffernan: это не относится ко всему HKCU, но применимо «внутри» HKCU. HKEY_CURRENT_USER\SOFTWARE\Wow6432Node
существует и HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node
прилично заполнен, по крайней мере, на моей рабочей станции
Для 32-битных приложений, работающих в 64-битных системах, функции реестра перенаправляются на 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);
}
Дополнительная информация о доступе к альтернативным представлениям реестра:
Найдите перенаправление реестра и рассмотрите возможность использования API реестра, который позволит вам получить доступ к 64-битному представлению реестра из 32-битного процесса.