我目前正在使用以下C ++代码MachineGuid
从Windows注册表中获取代码,并将该信息用于我的许可算法:
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位计算机上不起作用,并使用的ManagementObject
类为32位和64位提供了替代方法System.Management.dll
。问题在于此解决方案适用于C#,而不适用于C ++。我找不到与ManagementObject
该类等效的C ++ 。
因此,该问题的正确解决方案是什么:MachineGuid
使用C ++在x86和x64机器上获取窗口序列号()。
感谢您的帮助。
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 RAM,相对较快的SSD,但是WMI只需1-2秒即可初始化和运行甚至是一个简单的查询。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句