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

MyMemoWiki

「VC++」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
 
15行目: 15行目:
 
====簡単なサービスを作ってみる====
 
====簡単なサービスを作ってみる====
 
**[[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|B0011410[[R]]G}}
+
{{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 取得した値をマルチバイト文字列に変換する

  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <windows.h>
  4. #include <winreg.h>
  5. #include <atlstr.h>
  6.  
  7.  
  8. /// https://github.com/GiovanniDicanio/ReadStringsFromRegistry/blob/master/README.md
  9. /// http://chipmunkland.blog104.fc2.com/blog-entry-67.html
  10. ///
  11. int main()
  12. {
  13. // Windowsレジストリから文字列値を取得するために、Win32 RegGetValue() APIを使用する
  14. //
  15. // 取得する文字列のサイズは事前には分からないので、RegGetValue()関数を2回呼び出す
  16. // 最初の呼び出しの目的は、文字列を格納するのに十分な大きさのバッファを割り当てるためのサイズ値を取得する
  17. // サイズ値が決まれば、適切なバッファサイズを持つ CString インスタンスを割り当てることができる
  18. // 次に、RegGetValue()関数を再度呼び出し、今度はpvDataパラメータに有効なバッファポインタと、有効な最大バッファサイズを渡す
  19. // 2回目の呼び出しが成功すると、RegGetValue()関数は提供されたバッファに実際の文字列値を格納
  20.  
  21. DWORD keyType = 0;
  22. DWORD dataSize = 0;
  23. const DWORD flags = RRF_RT_REG_SZ; // 文字列(REG_SZ)のみ読み込み可
  24. LONG result = ::RegGetValue(
  25. HKEY_CURRENT_USER,
  26. _T("Software\\レジストリサブキー"),
  27. _T("レジストリ値"),
  28. flags,
  29. &keyType,
  30. nullptr, // pvData == nullptr ? Request buffer size
  31. &dataSize);
  32. if (result != ERROR_SUCCESS)
  33. {
  34. return 1;
  35. }
  36.  
  37. CString text;
  38. const DWORD bufferLength = dataSize / sizeof(WCHAR); // WCHARの長さ
  39. WCHAR* const textBuffer = text.GetBuffer(bufferLength);
  40.  
  41. // レジストリから文字列値をローカルの文字列バッファに読み込む
  42. result = ::RegGetValue(
  43. HKEY_CURRENT_USER,
  44. _T("Software\\レジストリサブキー"),
  45. _T("レジストリ値"),
  46. flags,
  47. nullptr,
  48. textBuffer, // このバッファに文字列を書き込む
  49. &dataSize);
  50.  
  51. if (result != ERROR_SUCCESS)
  52. {
  53. return 1;
  54. }
  55.  
  56. const DWORD actualStringLength = dataSize / sizeof(WCHAR);
  57.  
  58. // -1 to exclude the terminating NUL
  59. text.ReleaseBufferSetLength(actualStringLength - 1);
  60.  
  61. // std::wcout << text.GetString() << std::endl;
  62.  
  63. // CStringをマルチバイト文字に変換
  64. CT2A scr(text);
  65.  
  66. // std::wcout << scr << std::endl;
  67.  
  68. // プログラムを起動
  69. system(scr);
  70. //FreeConsole();
  71. ::ShowWindow(::GetConsoleWindow(), SW_HIDE);
  72.  
  73. return 0;
  74. }