ベースウェアが起動中であることを示すため、SSPは"ssp"、MateriaとCROWは"sakura"という名前のMutexを保持しています。
この名前つきMutexの存在を確認することで、起動中かどうかをローコストに判定できます。
Mutex自体の状態は決められておらず、シグナル状態か否かの確認は不要です。
すべてのベースウェアは起動中に名前つきファイルマッピングオブジェクト(FMO)を保持しています。
このプロセス間共有メモリを読み取ることで、起動中のゴーストを比較的低コストで取得できます。
書き込み中の不完全な情報の読み取りを避けるため、排他制御はFMO用Mutexで行っています。あわせて確認してください。
Sakura : OS依存、日本語OS上はShift JIS
SakuraUnicode : UTF-8固定 [SSP 2.5.26以降~]
最初の4バイト(0~3バイト目)は確保されているFMOのサイズを示します。
これは書き込まれている情報の長さではなく、あくまでもFMO自体の確保サイズを示す固定値です。
値は現在のところリトルエンディアンで0x00010000、つまり64KB固定になります。
他プログラムとの互換性確保のため、現在のところサイズ変更は考慮されていません。
4バイト目以降はFMOのデータ本体になります。これは以下のフォーマットになります。
(32バイトの識別ID).(キー名)[\1]値[\r\n]
[\1]はバイト値1、[\r\n]はCR+LF(改行)になります。
このフォーマットを複数行繰り返す形になります。
データ終端はC言語文字列と同じバイト値0になります。
ゆえに、データ本体で使用可能な最大サイズは65531バイト(65536 - 4 - 1)になります。
FMOに書き込む必要がある場合、サイズの限界を超えそうな場合は、不完全な情報の書き込みにならないよう留意してください。
サイズを超えそうな場合は1組分のデータを丸々書き込まないようにするのが望ましく、それが無理な場合でも1行の途中で終わらないようにしてください。
ゴースト1組分を示すユニークな識別IDです。少なくともFMO内では他と重複しない文字列を選ぶ必要があります。
何かユニークな情報を組み合わせてMD5ハッシュを取ったり、HWND(ウインドウハンドル)を組み合わせたりしている場合が多いです。
Materiaでの規格上は長さは規定されていませんが、互換性のため32バイト固定長とすべきです。
情報の種類を示すキーと情報本体です。以下の通りです。
FMO自体に排他制御の仕組みはないため、書き込み・読み取りの衝突を避けるために、別途Mutexを保持しています。
FMO名+"FMO"という名前になり、例えば以下のようになります。
FMO = Sakura : Mutex = SakuraFMO
FMO = SakuraUnicode : Mutex = SakuraUnicodeFMO
こちらはシグナル状態・非シグナル状態の判定が重要になります。
読み書きを行う際は、必ずWaitForSingleObjectや同等の待機関数を使い所有権を取得し、終わったらReleaseMutexで所有権を開放してください。
旧いベースウェア等でFMO用Mutexに対応していない場合があるので、Mutexの取得に失敗してもエラーにはしないでください。
ただしこの場合は、不完全な書き込み中のFMOを取得する可能性を考慮して、できるだけ安全に処理できるコードを書くよう留意してください。