C++ 64位操作系统调用 RegOpenKey() 读取注册表,返回 2, ERROR_FILE_NOT_FOUND

时间:2023-03-09 08:29:08
C++ 64位操作系统调用 RegOpenKey() 读取注册表,返回 2, ERROR_FILE_NOT_FOUND

环境:64位操作系统, VS2017

首先在命令行执行

REG ADD HKLM\Software\seastarsun /v serial /t REG_SZ /d 58ae4cb077a4e1

在注册表查看,已存在键值。

但通过C++读取该值,一致返回错误码 2,ERROR_FILE_NOT_FOUND。

同时试验 其他同目录下其他键值,是可以正确返回结果的。

string GetRegStr(string name, char* base)//得到name的字串值s, result必须先初始化
{
HKEY hResult;
char result[256];
strcpy_s(result, "");
LSTATUS status = RegOpenKey(HKEY_LOCAL_MACHINE, base, &hResult);
if (ERROR_SUCCESS != status)
{
cout << status << endl;
return "error";
}
DWORD dwcount = 255;
RegQueryValueEx(hResult, name.c_str(), 0, 0, (BYTE*)&result[0], &dwcount);
RegCloseKey(hResult);
cout<< result<<endl; return string(result); } string get_serial_reg()
{
//读取string类型
//*
char lpSubKey[] = "SOFTWARE\\Seastarsun";
return GetRegStr("Serial", lpSubKey);
//*/ /*
char lpSubKey[] = "SOFTWARE\\7-zip";
return GetRegStr("Path", lpSubKey);
//*/ }

上网查了N久,终于找到 一篇文章,介绍了64位操作系统注册表重定向的信息。

受 http://www.bathome.net/thread-30783-1-1.html。文章启发,WOW6432Node 目录下加入键值,

在 REG ADD HKLM\Software\WOW6432Node\seastarsun /v serial /t REG_SZ /d 58ae4cb077a4e1

重新使用上述函数查看,可以正确返回结果了。

又查看了WOW6432Node 目录下也包含7-zip,修改了WOW6432Node\7-zip的值,返回的也是修改后的。

原来C++ 读取注册表的时候被重定向了。