为什么RegOpenKeyEx允许我打开注册表编辑器中不存在的密钥?

Why does RegOpenKeyEx let me open a key that doesn't exist in Registry Editor?

本文关键字:不存在 密钥 编辑器 注册表 RegOpenKeyEx 允许我 为什么      更新时间:2023-10-16

在Microsoft Visual C++中,我有以下代码来访问注册表中的路径。然后我用RegQueryValueEx读取密钥Installed的值。到目前为止,值似乎是1,这与我的系统上存在的Visual C++2010运行时相对应。(它恰好是一段检测c++运行时存在的代码)。

现在,当我在HKEY_LOCAL_MACHINESOFTWAREMicrosoftVisualStudio10.0检查regedit.exe时,我在树中看不到VC

这怎么可能?我已经复制/粘贴了这个问题中的所有路径和代码,所以它们必须是正确的。

C++应用程序中的代码:

HKEY RegistryKey;
DWORD ErrorCode;
DWORD RegDwordValue = 0;
DWORD RegDwordValueSize = sizeof(DWORD);
if((ErrorCode = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
                "SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86",
                0, //Reserved
                KEY_READ,
                &RegistryKey)) != ERROR_SUCCESS)
{
    //Either the key does not exists, or registry access is denied. Anyway, detection did not succeed
    std::cout << "Could not read registry path:nt" << lpcRegistryPath << "ntError code: " << ErrorCode;
    return false;
}
if((ErrorCode = RegQueryValueEx(    RegistryKey,
                                    lpcValueToQuery,
                                    NULL,
                                    NULL,
                                    (LPBYTE)&RegDwordValue,
                                    &RegDwordValueSize
                                    )) != ERROR_SUCCESS)
{
    std::cout << "Could not read registry value, error " << ErrorCode;
    return false;
}

编辑:我在下面添加了注册表的导出

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftVisualStudio10.0]
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftVisualStudio10.0Debugger]
"FEQARuntimeImplDll"="C:\Program Files\Microsoft Visual Studio 10.0\Common7\Packages\Debugger\X64\Microsoft.VisualStudio.Debugger.Runtime.Impl.dll"
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftVisualStudio10.0Packages]
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftVisualStudio10.0Packages{4A0C6509-BF90-43DA-ABEE-0ABA3A8527F1}]
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftVisualStudio10.0Packages{4A0C6509-BF90-43DA-ABEE-0ABA3A8527F1}Settings]
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftVisualStudio10.0Packages{4A0C6509-BF90-43DA-ABEE-0ABA3A8527F1}SettingsTools]
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftVisualStudio10.0Packages{4A0C6509-BF90-43DA-ABEE-0ABA3A8527F1}SettingsToolsSSISScript]
"ScriptLanguage"="CSharp"

如果您所在的64位系统运行的是受注册表重定向或注册表虚拟化影响的32位应用程序,则会发生什么情况。如果您的VC++应用程序是32位的,并且您正在运行64位版本的regedit,或者您的应用程序是64位的,而您正在运行32位版本的正则表达式,那么他们将有效地查看/操作注册表的不同区域。这就解释了他们为什么看不到对方的数据。