我目前使用以下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
调用返回错误。在一些其他帖子中,这个链接非常清楚地解释了为什么在64位机器上不起作用,并提供了一个替代方案,使用来自
System.Management.dll
的ManagementObject
类适用于32位和64位。问题是这个解决方案只适用于C#,而不适用于C++。我找不到C++中与ManagementObject
类相当的方法。那么,如何才能正确解决问题:在x86和x64机器上都能获取窗口序列号(
MachineGuid
)并使用C++。感谢您的帮助。
UUID
可能与Windows操作系统“系统信息”应用程序中找到的UUID相关联,这是我在快速浏览中找到的可能与MachineGuid
相关的内容。 - Jonathon Ogden