| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

VC++

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

VC++

C++ | Visual Studio | C Sharp |

MFC

概略

簡単なダイアログアプリケーションを作ってみる

簡単なサービスを作ってみる

レジストリ文字列値の読み出し

https://github.com/GiovanniDicanio/ReadStringsFromRegistry/blob/master/README.md 上記を参考に、C++でレジストリから文字列値を取得する実装 http://chipmunkland.blog104.fc2.com/blog-entry-67.html 取得した値をマルチバイト文字列に変換する

#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;
}