在x86和x64体系结构中获取Windows序列号(MachineGuid)

我现在使用下面的C ++代码从Windowsregistry中获取MachineGuid ,并将该信息用于我的许可algorithm:

 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调用返回错误。

在其他一些post中, 这个链接非常清楚地解释了为什么这不适用于64位机器,并且使用System.Management.dllManagementObject类为32位和64位提供了替代scheme。 问题是这个解决scheme在C#上工作,而不是在C ++上。 我无法find一个C ++等价的ManagementObject类。

那么,问题的正确解决scheme是什么:使用C ++在x86和x64机器上获取窗口序列号( MachineGuid )。

感谢您的帮助。

KEY_WOW64_64KEY位添加到您的RegOpenKeyEx参数。 喜欢这个:

 RegOpenKeyEx( HKEY_LOCAL_MACHINE, key.c_str(), 0, KEY_READ | KEY_WOW64_64KEY, &hKey ) 

该文档说,它在32位操作系统上被忽略,所以你甚至不需要检测WOW64。

PS我不推荐WMI,它太慢了。 我目前有i5-4460 CPU,16GB内存,相对较快的SSD,然而WMI需要1-2秒来初始化和运行一个简单的查询。