現在、WindowsレジストリからMachineGuid
を取得し、私のライセンスアルゴリズムのためにその情報を使用するには、次のC++のコードを使用して - 私:取得窓のシリアル番号(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++アプリケーションで使用できます。 [C++を使用したWMIアプリケーションの作成](https://msdn.microsoft.com/en-us/library/aa389762(v = vs.85).aspx)を参照することをお勧めします。 [Win32_Provider](https://msdn.microsoft.com/en-us/library/dn792258(v=vs.85).aspx)のいずれかを照会するために、WQLクエリ(SQLに似ています)を実行することになります。 ) クラス。 この時点では、「MachineGuid」と同等のものが含まれています。 [Win32_ComputerSystem](https://msdn.microsoft.com/en-us/library/aa394102(v = vs.85).aspx)が出発点になります。 –
[Win32_ComputerSystemProduct](https://msdn.microsoft.com/en-us/library/aa394105(v = vs.85).aspx)で検索されたUUIDに関連する「UUID」 Windows OSシステム情報アプリケーションは、私が「MachineGuid」に関連する可能性があることを一目でわかるものです。 –