我目前正在使用以下 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 位机器上不起作用,并使用 System.Management.dll
中的 ManagementObject
类提供了 32 位和 64 位的替代方案。问题是这个解决方案适用于 C#,而不适用于 C++。我找不到与 ManagementObject
类等效的 C++。
那么,问题的正确解决方案是什么:使用 C++ 在 x86 和 x64 机器上获取窗口序列号 (MachineGuid
)。
感谢您的帮助。
最佳答案
将 KEY_WOW64_64KEY
位添加到您的 RegOpenKeyEx 参数。像这样:
RegOpenKeyEx( HKEY_LOCAL_MACHINE, key.c_str(), 0, KEY_READ | KEY_WOW64_64KEY, &hKey )
The documentation说它在 32 位操作系统上被忽略,所以你甚至不需要检测 WOW64。
附言我不推荐 WMI,它太慢了。我目前有 i5-4460 CPU、16GB RAM、相对较快的 SSD,但 WMI 需要 1-2 秒来初始化和运行一个简单的查询。
关于c++ - 在 x86 和 x64 体系结构中获取 Windows 序列号 (MachineGuid),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38332743/