「VC++」の版間の差分
ナビゲーションに移動
検索に移動
| 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 <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; | ||
| + | } | ||
| + | </pre> | ||
---- | ---- | ||
| − | {{amazon| | + | {{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;
}
© 2006 矢木浩人