2016-07-12 15 views
1

現在、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)を取得する。

ありがとうございます。

+1

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)が出発点になります。 –

+0

[Win32_ComputerSystemProduct](https://msdn.microsoft.com/en-us/library/aa394105(v = vs.85).aspx)で検索されたUUIDに関連する「UUID」 Windows OSシステム情報アプリケーションは、私が「MachineGuid」に関連する可能性があることを一目でわかるものです。 –

答えて

4

RegOpenKeyEx引数にKEY_WOW64_64KEYビットを追加します。このように:

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

The documentationあなたも、WOW64を検出する必要はありませんので、それは、32ビットのOS上で無視されますと言います。

P.S.私はWMIを推奨しませんが、それは遅すぎます。私は現在、i5-4460のCPU、16GBのRAM、比較的高速のSSDを持っていますが、WMIは簡単なクエリでも初期化して実行するのに1〜2秒かかります。

+0

ありがとう... 64bitオプションのみの32bitと64bitの両方の実装に 'KEY_WOW64_64KEY'を追加し、それを使わないで32bitを保つべきでしょうか? – Mendes

+0

ちょうど32ビットで動作しますが、両方を追加することは無害です。 – Soonts

+1

素晴らしい!ありがとう!!!完璧に動作します! – Mendes

関連する問題