前回の続きです。
「ファイル検索ツールを作ってみた – C++Builder好きの秘密基地」で公開されているファイル検索ツールのソースコードを読んで勉強します。
Option.cppを見てみます。
メンバ関数のload・saveで設定を読み書きしています。
この処理の中でTCriticalSectionクラスが使用されています。
TCriticalSectionクラスはクリティカルセクションで排他処理を行うクラスです。
TCriticalSectionの基本的な使い方は次のようになります。
std::unique_ptr<TCriticalSection> pCS(new TCriticalSection);
pCS->Enter(); //他のスレッドをブロックする
try
{
ここで処理を行う
}
__finally
{
pCS->Release(); //ブロックを解除する
}
参考
TRegistryIniFileExクラスはTRegistryIniFileクラスにTStringsの読み書きを追加したクラスのようです。
読み書きの詳細はRegistryEx.cppで見ることができます。
書き込み処理
bool RegWriteMultiString(TRegistry* pReg, UnicodeString Name, TStrings* pList)
{
std::vector<wchar_t> Buffer;
//Stringsの値を\0区切りでBufferに代入する
LONG ret = RegSetValueEx(pReg->CurrentKey, Name.c_str(), NULL, REG_MULTI_SZ,
(BYTE*)&Buffer[0], sizeof(wchar_t) * Buffer.size());
Win32APIのRegSetValueEx 関数でレジストリに登録しています。
std::vectorは内部のメモリが連続していますので、「&Buffer0」でバッファの先頭アドレスを取得できます。
読み込み処理
bool RegReadMultiString(TRegistry* pReg, UnicodeString Name, TStrings* pList)
{
//データサイズの取得
//バッファの作成
std::vector<wchar_t>Buffer(BufferSize, L'\0');
//読み込み
if (RegQueryValueEx(pReg->CurrentKey, Name.w_str(), NULL, &RegType,
(BYTE*) & Buffer[0], &RegDataSize) != ERROR_SUCCESS) {
return false;
}
読み込み処理でも同様に「&Buffer0」でstd::vectorに値を設定することができます。
Singleton.hには、DECLARE_SINGLETONとIMPLEMENT_SINGLETONの2つマクロが定義されています。
これらはシングルトンパターンを簡単に実現するためのマクロです。
ソースコードのまとまりとマクロとして用意しておくことで、継承などを使わなくても簡単にシングルトンパターンを実現できています。
オプション画面(frmOption)ではTJvOpenDialogコンポーネントが使用されていました。
JVCLのコンポーネントです。
「D_DevLog [JVCL]JvOpenDialog/JvSaveDialog」に解説がありました。
TOpenDialogを基にダイアログ表示時のカスタマイズ性が強化されたコンポーネントのようです。
バージョン情報画面(frmAbout)では、URLをクリックしたときの処理にJCLのOpenFolder関数が使用されています。
#include <jclshell.hpp>
OpenFolder(Link, NULL, false)
JCL/JVCLには便利な機能を活用することで、開発効率が大きく向上するように思います。
おしまい。
Pingback: ファイル検索ツールのソースコードを読んで勉強する(3) « 山本隆の開発日誌