【VC++】レジストリからWindows10のバージョン情報を取得する

0

    <機能>

    (1)RegOpenKeyExでレジストリをオープンします

       HKEY_LOCAL_MACHINE

       SOFTWARE¥Microsoft¥Windows NT¥CurrentVersion

    (2)RegQueryValueExを使ってレジストリの値を取得します

       ProductName

       ReleaseId

       CurrentBuildNumber

       UBR

    (3)Windows10のバージョン情報を表示します

    Winver,WIndows10,バージョン情報表示,

     

    <動作検証&開発環境>
    Visual Studio Community 2017

     

    <イメージ>

    OS Windows 10 Enterprise

    バージョン 1803

    OSビルド 17134.345

     

    Version情報,実行イメージ,ProductName,ReleaseId,CurrentBuildNumber,UBR,

     

    <使い方>

    (1)プロジェクトの選択でデスクトップウィザードを指定します

       アプリケーションの種類:コンソールアプリケーション

       共通ヘッダの追加:MFCにチェック

    (2)コードを記述します

     

    //プロトタイプ宣言
    CString GetWindows10Version();
    CString GetRegDataText(DWORD dwType, DWORD dwSize, TCHAR *buf, CString csEntry);
    const int DMAX_SIZE = 256;

     

    int main()
    {
        if (hModule != nullptr)
        {
            // MFC を初期化して、エラーの場合は結果を印刷します。
            if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
            {
                //〜〜省略〜〜
            }
            else
            {

                //Window10のバージョン情報をレジストリから取得
                CString csRet = GetWindows10Version();
                //結果を出力
                AfxMessageBox(csRet, MB_ICONINFORMATION);
            }
        }
        else
        {
            //〜〜省略〜〜
        }

        return nRetCode;
    }

     

    /******************************************************
    GetWindows10Version
    レジストリからRegQueryValueExを使用してバージョン情報を取得する

     

    戻り値
     バージョン情報(タイプ/サイズ/値)
    ******************************************************/

    CString GetWindows10Version()
    {
        HKEY hKey = nullptr; //レジストリキーのハンドル
        LONG lRet;
        CString csRet=_T("");
        TCHAR buf[DMAX_SIZE];
        DWORD dwSize,dwType,dwVal=0;

        //レジストリオープン
        lRet = RegOpenKeyEx(
            HKEY_LOCAL_MACHINE,
            _T("SOFTWARE¥¥Microsoft¥¥Windows NT¥¥CurrentVersion"),
            0,
            KEY_QUERY_VALUE,
            &hKey
        );
        //レジストリオープンエラー
        if (lRet != ERROR_SUCCESS)
        {
            csRet = _T("RegOpenKeyExエラー");
            goto lbl_Error;
        }

        //RegQueryValueExについてはDeveloperNetwork参照
        //// プロダクト(OS)を取得 //////////
        dwSize = DMAX_SIZE;
        ZeroMemory(&buf, DMAX_SIZE*2);
        lRet = RegQueryValueEx(
            hKey,
            _T("ProductName"),
            0,
            &dwType,
            (LPBYTE)buf,
            &dwSize
        );
        //プロダクト 値取得エラー
        if (lRet != ERROR_SUCCESS)
        {
            csRet = _T("RegQueryValueEx(ProductName)エラー");
            goto lbl_Error;
        }
        csRet = _T("【Windows Version情報】¥r¥n");
        csRet += GetRegDataText(dwType, dwSize, buf, _T("ProductName"));

     

        //// リリースIDを取得 //////////
        dwSize = DMAX_SIZE;
        ZeroMemory(&buf, DMAX_SIZE * 2);
        lRet = RegQueryValueEx(
            hKey,
            _T("ReleaseId"),
            0,
            &dwType,
            (LPBYTE)buf,
            &dwSize
        );
        //リリースID 値取得エラー
        if (lRet != ERROR_SUCCESS)
        {
            csRet = _T("RegQueryValueEx(ReleaseId)エラー");
            goto lbl_Error;
        }
        csRet += GetRegDataText(dwType, dwSize, buf,_T("ReleaseId"));

     

        //// ビルドバージョンを取得 //////////
        dwSize = DMAX_SIZE;
        ZeroMemory(&buf, DMAX_SIZE * 2);
        lRet = RegQueryValueEx(
            hKey,
            _T("CurrentBuildNumber"),
            0,
            &dwType,
            (LPBYTE)buf,
            &dwSize
        );
        //ビルドバージョン 値取得エラー
        if (lRet != ERROR_SUCCESS)
        {
            csRet = _T("RegQueryValueEx(CurrentBuildNumber)エラー");
            goto lbl_Error;
        }
        csRet += GetRegDataText(dwType, dwSize, buf, _T("CurrentBuildNumber"));

     

        //// ビルドバージョン(UBR)を取得 //////////
        dwSize = DMAX_SIZE;
        ZeroMemory(&buf, DMAX_SIZE * 2);
        lRet = RegQueryValueEx(
            hKey,
            _T("UBR"),
            0,
            &dwType,
            (LPBYTE)buf,
            &dwSize
        );
        //ビルドバージョン(UBR) 値取得エラー
        if (lRet != ERROR_SUCCESS)
        {
            csRet = _T("RegQueryValueEx(UBR)エラー");
            goto lbl_Error;
        }
        csRet += GetRegDataText(dwType, dwSize, buf, _T("UBR"));

    lbl_Error:
        if (hKey != NULL)
        {
            //レジストリクローズ
            RegCloseKey(hKey);
        }
        return csRet;
    }

    /******************************************************
    GetRegDataText
    取得したタイプ(データ型)/サイズ/値より表示用文字列を生成

     

    引数
     dwType  : タイプ(データ型)
     dwSize  : データサイズ
     buf     : レジストリの値
     csEntry : レジストリのエントリ名
    戻り値
     表示用文字列
    ******************************************************/

    CString GetRegDataText(DWORD dwType,DWORD dwSize,TCHAR *buf,CString csEntry)
    {
        CString csRet = _T("¥r¥n=== ") + csEntry + _T(" ==========¥r¥n");
        CString cwk;
        int iwk;

        //読みだしたタイプに応じてサイズと値を設定
        //ここでは必要なタイプのみ設定するがタイプの詳細はDeveloperNetwork参照
        switch (dwType)
        {
        case REG_DWORD:
            iwk = (int)buf[0];
            cwk.Format(_T("   VALUE: %d¥r¥n   SIZE: %d  TYPE: REG_DWORD¥r¥n"), iwk, dwSize);
            break;
        case REG_SZ:
            cwk.Format(_T("   VALUE: %s¥r¥n   SIZE: %d  TYPE: REG_SZ¥r¥n"), buf, dwSize);
            break;
        }
       
        csRet += cwk;
        return csRet;
    }

     

    よろしければポチッと押してください


    プログラマー ブログランキングへ



    selected entries

    categories

    calendar

    S M T W T F S
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
    << December 2018 >>

    profile

    others

    archives