【发布时间】:2016-07-12 15:09:48
【问题描述】:
我目前正在使用以下 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)。
感谢您的帮助。
【问题讨论】:
-
WMI 可通过 COM API 用于 C++ 应用程序。我建议查看Creating a WMI Application using C++。您将寻求执行 WQL 查询(类似于 SQL)来查询 Win32_Provider 类之一。我现在不能告诉你的是哪个包含
MachineGuid的等价物。 Win32_ComputerSystem 可能是您的起点。 -
如果您继续追求 WMI 解决方案,Win32_ComputerSystemProduct
UUID与 Windows 操作系统系统信息应用程序中的 UUID 相关,我一眼就能找到可能与 @ 987654335@.