使用RegOpenKeyEx的奇怪行为

时间:2012-06-06 13:48:01

标签: 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;
}

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

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

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

3 个答案:

答案 0 :(得分:2)

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

要了解这一点,您可以运行Process Monitor ...

答案 1 :(得分:0)

远程计算机上可能没有该密钥,或者您没有访问权限。

检查documentation及其返回的错误代码。

答案 2 :(得分:0)

使用FormatMessage( ... )功能显示更有意义的错误描述。