C++ レジストリの文字列値を取得

https://github.com/GiovanniDicanio/ReadStringsFromRegistry/blob/master/README.md

上記を参考に、C++でレジストリから文字列値を取得する実装

http://chipmunkland.blog104.fc2.com/blog-entry-67.html

取得した値をマルチバイト文字列に変換する

 

// DsScrLauncher2.cpp : このファイルには 'main' 関数が含まれています。プログラム実行の開始と終了がそこで行われます。
//

#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <winreg.h>
#include <atlstr.h>


/// https://github.com/GiovanniDicanio/ReadStringsFromRegistry/blob/master/README.md
/// http://chipmunkland.blog104.fc2.com/blog-entry-67.html
///
int main()
{
    // Windowsレジストリから文字列値を取得するために、Win32 RegGetValue() APIを使用する
    // 
    // 取得する文字列のサイズは事前には分からないので、RegGetValue()関数を2回呼び出す
    // 最初の呼び出しの目的は、文字列を格納するのに十分な大きさのバッファを割り当てるためのサイズ値を取得する
    // サイズ値が決まれば、適切なバッファサイズを持つ CString インスタンスを割り当てることができる
    // 次に、RegGetValue()関数を再度呼び出し、今度はpvDataパラメータに有効なバッファポインタと、有効な最大バッファサイズを渡す
    // 2回目の呼び出しが成功すると、RegGetValue()関数は提供されたバッファに実際の文字列値を格納

    DWORD keyType = 0;
    DWORD dataSize = 0;
    const DWORD flags = RRF_RT_REG_SZ; // 文字列(REG_SZ)のみ読み込み可
    LONG result = ::RegGetValue(
        HKEY_CURRENT_USER,
        _T("Software\\レジストリサブキー"),
        _T("レジストリ値"),
        flags,
        &keyType,
        nullptr, // pvData == nullptr ? Request buffer size
        &dataSize);
    
    if (result != ERROR_SUCCESS)
    {
        return 1;
    }

    CString text;
    const DWORD bufferLength = dataSize / sizeof(WCHAR); // WCHARの長さ
    WCHAR* const textBuffer = text.GetBuffer(bufferLength);

    // レジストリから文字列値をローカルの文字列バッファに読み込む
    result = ::RegGetValue(
        HKEY_CURRENT_USER,
        _T("Software\\レジストリサブキー"),
        _T("レジストリ値"),
        flags,
        nullptr,
        textBuffer, // このバッファに文字列を書き込む
        &dataSize);

    if (result != ERROR_SUCCESS)
    {
        return 1;
    }

    const DWORD actualStringLength = dataSize / sizeof(WCHAR);

    // -1 to exclude the terminating NUL
    text.ReleaseBufferSetLength(actualStringLength - 1);

    // std::wcout << text.GetString() << std::endl;

    // CStringをマルチバイト文字に変換
    CT2A scr(text);

    // std::wcout << scr << std::endl;

    // プログラムを起動
    system(scr);
    
    //FreeConsole();
    ::ShowWindow(::GetConsoleWindow(), SW_HIDE);

    return 0;
}

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です