Menu

Ini

develop (84)
novice123

内部構造>sakura.iniファイル

sakura.iniファイル

テキストエディタでは実行ファイルと同一ディレクトリにsakura.iniというファイルを作って設定情報を保存します.

WindowsのIniファイル操作関数では64kB(?)以上のiniファイルを扱えないらしいのですが,このエディタでは Windowsの機能ではなくCProfileクラスで自前の処理を行っているためにこのような制約を受けません.

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というメソッドが用意されています.

BOOL ReadProfile

引数

const char *pszProfileName

pszProfileNameで指示されたファイルをメモリに読み込むメソッドです.最初にファイルを一括してメモリに読み込んでから 1行ずつ解析します.

//で始まる行はコメントと見なされます.

[SECTION]のように行頭に[]で囲まれた文字列を発見すると,AddSectionで新しいセクションを登録してその番号を取得します.(既出の場合はそのセクション番号を取得します).

途中に=が含まれている行であればその前部を項目名,後部を値と見なしてAddSectionDataで現在のセクションに登録します.(既に同一の名前が存在する場合には後出の値が有効になります.)

それ以外の行は無視します.

BOOL WriteProfile

引数

const char* pszProfileName,
const char* pszComment

メモリ内の設定データを指定されたファイルに書き出します.

第2引数で指定した文字列がコメントとしてiniファイルの先頭に入ります.

IOProfileData

引数

BOOL bRead, // 読み(TRUE),書き(FALSE)のどちらかを示すフラグ
const char* pszSectionName, // セクション名
const char* lpValueName, // 項目名
int nRegCnvID,  // データの型
char* lpDataSrc, // データへのポインタ
int cbDataSrc  // データ長

CProfileクラスの内部変数に対して値の要求・設定を行うメソッド.

nRegCnvIDでデータの型を指定する.指定できるのは以下の通り.

  • REGCNV_INT2SZ: int型.10進数で記録される.
  • REGCNV_WORD2SZ: WORD型.10進数で記録される.
  • REGCNV_SZ2SZ: 文字列型.そのまま記録される.
  • REGCNV_CHAR2SZ: CHAR型.文字として記録される.
  • REG_MULTI_SZ: Binary型.バイナリ列としてそのまま記録される.

これ自体は内部の記憶領域を操作するだけなので,読み出しの時はあらかじめReadProfileを呼び出す必要があり,書き込みの時は最後にWriteProfileを呼び出す必要がある.

REG_MULTI_SZのとき,バイト列の中に\r\nがあるとおかしくなるので,Binaryの場合はテキスト表現にEncodeして(BASE64など)保存するべきでしょう.

読み出し

CShareData::LoadShareDataが共有メモリの内容を読み出すメソッドで,WinMainの中から呼び出されます.この部分が2重に呼び出されると共有メモリの整合性が取れなくなる可能性があるため,Mutexを用いて多重呼び出しを防ぐようになっています.

共有メモリはまずCShareData::Initによって初期化されます.ここではCreateFileMapping(),MapViewOfFileで共有メモリを作り,そこに初期値をせっせと書き込んでいます.iniファイルが見つからなかった場合にはここで設定した値がそのまま使われます.

CShareData::LoadShareDataShareData_IO_2(TRUE)を呼び出すだけです. ShareData_IO_2にはCProfileにと共有メモリの間で値を設定する処理が書かれています.共有メモリの要素とその名前をCProfileに与えることで読み,書きを行います.共有メモリに保持すべき項目を追加した場合にはここを書き換えることで対応できます.読み込み処理と書き込み処理で各項目の処理部を共有しているので,1カ所追加するだけで新規項目に対応できます.

書き込み

CShareData::SaveShareDataが共有メモリの内容を保存するメソッドで,WinMainの中から呼び出されます.CShareData::SaveShareDataShareData_IO_2(FALSE)を呼び出すだけです.


Related

Wiki: Design

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.