[英]Getting windows serial number (MachineGuid) in both x86 and x64 architectures
我目前正在使用以下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 ++。 我找不到與ManagementObject
類相對應的C ++。
因此,解決該問題的正確方法是什么:使用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 RAM,相對較快的SSD,但是WMI只需1-2秒即可初始化和運行一個簡單的查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.