c++ - RegOpenKeyEx 的奇怪行为

标签 c++ c windows registry

在工作中,我遇到了我们产品的奇怪行为,发现可以归结为 Windows API RegOpenKeyEx 的奇怪行为。 下面是我的测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(int argc, char* argv[])
{
    HKEY hk;
    LONG lreturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("Software\\Mercury Interactive\\LoadRunner\\Vugen\\Logger\\media"),
    0, 
    KEY_READ, 
    &hk ); 

    if(lreturn==ERROR_SUCCESS)
    {
        printf("YES!\n");
    }
    else
    {
        printf("NO!\n");
    }
    char a ;
    scanf("%c ", &a);

    return 0;
}

在我的本地计算机上,上述程序提示“YES”,而在另一个远程虚拟机上运行时,它输出“NO”。

在两台计算机上,注册表项“Software\Mercury Interactive\LoadRunner\Vugen\Logger\media”存在于 HKEY_CURRENT_USER 而不是 HKEY_LOCAL_MACHINE 下。

所以我很困惑为什么它在本地计算机上输出“YES”?更奇怪的是,为什么它在两台机器上的行为不同? 本地机器是Win7 64位。远程虚拟机是Win7 32位。该程序编译为 32 位。

最佳答案

这听起来有点像 Registry Virtualization ,如果本地计算机在 VirtualStore 中有一个条目(开发过程中之前的 Create 调用?),即使 HKLM 下不存在该 key ,open 调用也会成功。

要弄清楚这一点,您可以运行 Process Monitor ...

关于c++ - RegOpenKeyEx 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10915529/

相关文章:

c++ - 如何让 g++ 强制我遵守 C++ 标准

c++ - 覆盖抽象类的属性

python - pyinstaller编译成exe

c# - 如何获取长路径的安全详细信息?

c - 素数之和

windows - 如何通过 Azure Pipelines 安装 .Net Core Hosting Bundle?

c++ - 为什么控制台 C++ 程序在 Visual Studio 中具有不同的起始代码?

Java 应用程序和 C++ 应用程序集成/通信

mysql - 为什么编译器找不到 mysql 包含?

c - STM32F407 USART1 : Clearing USART_FLAG_TC requires pgm to be halted before actually clearing the bit