内部構造>sakura.iniファイル
テキストエディタでは実行ファイルと同一ディレクトリにsakura.iniというファイルを作って設定情報を保存します.
WindowsのIniファイル操作関数では64kB(?)以上のiniファイルを扱えないらしいのですが,このエディタでは Windowsの機能ではなくCProfileクラスで自前の処理を行っているためにこのような制約を受けません.
(05/JUN/2004) CProfileはSTL準拠のものに差し替えられましたので,現在はここで解説している構造とは異なった物になっています.
セクション数
int m_nSecNum;
セクション名を保持する配列
CMemory* m_pSecNameArr[MAX_SECNUM];
各セクションのデータ数
int m_nSecDataNumArr[MAX_SECNUM];
項目名を保持する配列
CMemory* m_pDataNameArr[MAX_SECNUM][MAX_SECDATA];
値を保持する配列
CMemory* m_pDataArr[MAX_SECNUM][MAX_SECDATA];
セクションには番号が振られていて,m_pSecNameArrのインデックスと指す内容によって番号と名前の対応を知ることが出来ます.名前からセクション番号を得るためにSearchSectionというメソッドが用意されています.
各セクションに対して名前と値のペアを保管できます.m_pDataNameArrが名前を,m_pDataArrが値を保持するようになっており,同一indexのものが対応します.名前からindexを取得するためのSearchDataNameというメソッドが用意されています.
引数
const char *pszProfileName
pszProfileNameで指示されたファイルをメモリに読み込むメソッドです.最初にファイルを一括してメモリに読み込んでから 1行ずつ解析します.
//で始まる行はコメントと見なされます.
[SECTION]のように行頭に[]で囲まれた文字列を発見すると,AddSectionで新しいセクションを登録してその番号を取得します.(既出の場合はそのセクション番号を取得します).
途中に=が含まれている行であればその前部を項目名,後部を値と見なしてAddSectionDataで現在のセクションに登録します.(既に同一の名前が存在する場合には後出の値が有効になります.)
それ以外の行は無視します.
引数
const char* pszProfileName, const char* pszComment
メモリ内の設定データを指定されたファイルに書き出します.
第2引数で指定した文字列がコメントとしてiniファイルの先頭に入ります.
引数
BOOL bRead, // 読み(TRUE),書き(FALSE)のどちらかを示すフラグ const char* pszSectionName, // セクション名 const char* lpValueName, // 項目名 int nRegCnvID, // データの型 char* lpDataSrc, // データへのポインタ int cbDataSrc // データ長
CProfileクラスの内部変数に対して値の要求・設定を行うメソッド.
nRegCnvIDでデータの型を指定する.指定できるのは以下の通り.
これ自体は内部の記憶領域を操作するだけなので,読み出しの時はあらかじめReadProfileを呼び出す必要があり,書き込みの時は最後にWriteProfileを呼び出す必要がある.
REG_MULTI_SZのとき,バイト列の中に\r\nがあるとおかしくなるので,Binaryの場合はテキスト表現にEncodeして(BASE64など)保存するべきでしょう.
CShareData::LoadShareDataが共有メモリの内容を読み出すメソッドで,WinMainの中から呼び出されます.この部分が2重に呼び出されると共有メモリの整合性が取れなくなる可能性があるため,Mutexを用いて多重呼び出しを防ぐようになっています.
共有メモリはまずCShareData::Initによって初期化されます.ここではCreateFileMapping(),MapViewOfFileで共有メモリを作り,そこに初期値をせっせと書き込んでいます.iniファイルが見つからなかった場合にはここで設定した値がそのまま使われます.
CShareData::LoadShareDataはShareData_IO_2(TRUE)を呼び出すだけです. ShareData_IO_2にはCProfileにと共有メモリの間で値を設定する処理が書かれています.共有メモリの要素とその名前をCProfileに与えることで読み,書きを行います.共有メモリに保持すべき項目を追加した場合にはここを書き換えることで対応できます.読み込み処理と書き込み処理で各項目の処理部を共有しているので,1カ所追加するだけで新規項目に対応できます.
CShareData::SaveShareDataが共有メモリの内容を保存するメソッドで,WinMainの中から呼び出されます.CShareData::SaveShareDataはShareData_IO_2(FALSE)を呼び出すだけです.