与RegOpenKeyEx奇怪的行为

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

#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”。

在这两台计算机上,registry项“Software \ Mercury Interactive \ LoadRunner \ Vugen \ Logger \ media”位于HKEY_CURRENT_USER下,而不是HKEY_LOCAL_MACHINE。

所以我很困惑为什么它在本地机器上输出“是”? 还有一个陌生人,为什么两台机器的行为不同? 本地机器是Win7 64bit。 远程虚拟机是Win7 32bit。 该程序被编译为32位。

这听起来有点像注册表虚拟化 ,如果本地计算机在VirtualStore中有一个条目(在开发过程中的前一个创建调用?),打开的调用将成功,即使密钥不存在于HKLM下。

为了得到这个底部,你可以运行进程监视器 …

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

检查文档 ,并返回错误代码。

使用FormatMessage( ... )函数来显示错误的更详细的描述。