2

在工作中我遇到了我们产品的一个奇怪行为,发现可以归结为 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;
}

在我的本地机器上,上面的程序提示“是”,而在另一个远程虚拟机上运行时,它会输出“否”。

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

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

4

3 回答 3

2

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

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

于 2012-06-06T13:59:06.467 回答
0

使用该FormatMessage( ... )函数显示更有意义的错误描述。

于 2012-06-06T14:21:23.347 回答
0

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

检查文档,以及它返回的错误代码。

于 2012-06-06T13:53:30.127 回答