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

MyMemoWiki

「VC++」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
(ページの作成:「==VC++== [C++][Visual Studio][C#] ===MFC=== ====概略==== *[MFC はじめに] [はじめに] *[MFC イベントハンドリング] [イベントハンドリング]…」)
 
 
(同じ利用者による、間の4版が非表示)
1行目: 1行目:
 
==VC++==
 
==VC++==
[C++][Visual Studio][C#]
+
[[C++]] | [[Visual Studio]] | [[C Sharp]] |
===MFC===
+
===[[MFC]]===
 
====概略====
 
====概略====
*[MFC はじめに] [はじめに]
+
*[[MFC はじめに|はじめに]]
*[MFC イベントハンドリング] [イベントハンドリング]
+
*[[MFC イベントハンドリング|イベントハンドリング]]
*[VC++ メンバー関数のオーバーライド] [メンバー関数のオーバーライド]
+
*[[VC++ メンバー関数のオーバーライド|メンバー関数のオーバーライド]]
*[MFC CString] [CString]
+
*[[MFC CString|CString]]
 
====簡単なダイアログアプリケーションを作ってみる====
 
====簡単なダイアログアプリケーションを作ってみる====
*[MFC ダイアログの作成] [ダイアログの作成]
+
*[[MFC ダイアログの作成|ダイアログの作成]]
**[MFC ファイルを選択] [ファイルを選択]
+
**[[MFC ファイルを選択|ファイルを選択]]
**[MFC ファイルを読む] [ファイルを読む]
+
**[[MFC ファイルを読む|ファイルを読む]]
**[MFC リストボックスに要素を追加] [リストボックスに要素を追加]
+
**[[MFC リストボックスに要素を追加|リストボックスに要素を追加]]
**[MFC マルチスレッド] [マルチスレッド化]
+
**[[MFC マルチスレッド|マルチスレッド化]]
 
====簡単なサービスを作ってみる====
 
====簡単なサービスを作ってみる====
**ATLサービスプロジェクト
+
**[[ATLサービスプロジェクト]]
 +
====レジストリ文字列値の読み出し====
 +
https://github.com/GiovanniDicanio/ReadStringsFromRegistry/blob/master/README.md
 +
上記を参考に、C++でレジストリから文字列値を取得する実装
 +
http://chipmunkland.blog104.fc2.com/blog-entry-67.html
 +
取得した値をマルチバイト文字列に変換する
 +
 
 +
<pre>
 +
#include &lt;stdio.h&gt;
 +
#include &lt;iostream&gt;
 +
#include &lt;windows.h&gt;
 +
#include &lt;winreg.h&gt;
 +
#include &lt;atlstr.h&gt;
 +
 
 +
 
 +
/// 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,
 +
        &amp;keyType,
 +
        nullptr, // pvData == nullptr ? Request buffer size
 +
        &amp;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, // このバッファに文字列を書き込む
 +
        &amp;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 &lt;&lt; text.GetString() &lt;&lt; std::endl;
 +
 
 +
    // CStringをマルチバイト文字に変換
 +
    CT2A scr(text);
 +
 
 +
    // std::wcout &lt;&lt; scr &lt;&lt; std::endl;
 +
 
 +
    // プログラムを起動
 +
    system(scr);
 +
   
 +
    //FreeConsole();
 +
    ::ShowWindow(::GetConsoleWindow(), SW_HIDE);
 +
 
 +
    return 0;
 +
}
 +
</pre>
  
 
----
 
----
 
{{amazon|B0011410RG}}
 
{{amazon|B0011410RG}}

2022年7月31日 (日) 03:55時点における最新版

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