ファイル検索ツールのソースコードを読んで勉強する(4)

前回の続きです。

ファイル検索ツールを作ってみた – 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には便利な機能を活用することで、開発効率が大きく向上するように思います。

おしまい。

コメント

  1. Pingback: ファイル検索ツールのソースコードを読んで勉強する(3) « 山本隆の開発日誌

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください