我现在使用下面的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.dll
的ManagementObject
类为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秒来初始化和运行一个简单的查询。