我目前正在使用以下C ++代码从Windows注册表中获取MachineGuid
并将该信息用于我的许可算法:
std::wstring key = L"SOFTWARE\\Microsoft\\Cryptography";
std::wstring name = L"MachineGuid";
HKEY hKey;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, key.c_str(), 0, KEY_READ, &hKey) != ERROR_SUCCESS)
throw std::runtime_error("Could not open registry key");
DWORD type;
DWORD cbData;
if (RegQueryValueEx(hKey, name.c_str(), NULL, &type, NULL, &cbData) != ERROR_SUCCESS)
{
RegCloseKey(hKey);
throw std::runtime_error("Could not read registry value");
}
if (type != REG_SZ)
{
RegCloseKey(hKey);
throw "Incorrect registry value type";
}
std::wstring value(cbData/sizeof(wchar_t), L'\0');
if (RegQueryValueEx(hKey, name.c_str(), NULL, NULL, reinterpret_cast<LPBYTE>(&value[0]), &cbData) != ERROR_SUCCESS)
{
RegCloseKey(hKey);
throw "Could not read registry value";
}
RegCloseKey(hKey);
这在x86系统(32位)上运行良好。现在我已将整个代码迁移到x64(64位)Windows,并且RegQueryValueEx
调用返回错误。
在其他一些帖子中,this link非常清楚地解释了为什么这不适用于64位计算机,并使用ManagementObject
中的System.Management.dll
类为32位和64位提供了替代方案。问题是这个解决方案适用于C#,而不适用于C ++。我找不到ManagementObject
类的C ++等价物。
那么,问题的正确解决方案是什么:使用C ++在x86和x64机器上获取窗口序列号(MachineGuid
)。
感谢您的帮助。
答案 0 :(得分:4)
将KEY_WOW64_64KEY
位添加到RegOpenKeyEx参数中。像这样:
RegOpenKeyEx( HKEY_LOCAL_MACHINE, key.c_str(), 0, KEY_READ | KEY_WOW64_64KEY, &hKey )
The documentation表示它在32位操作系统上被忽略,所以你甚至不需要检测WOW64。
P.S。我不推荐WMI,它太慢了。我目前拥有i5-4460 CPU,16GB RAM,相对较快的SSD,但WMI需要1-2秒才能初始化并运行一个简单的查询。