TSakuraSeeker

概要

伺か互換システムのFile-mapping Object(通称FMO)を利用して、現在のローカルマシンで起動している伺か互換システムの情報を取得します。

2003/04 より、'SakuraFMO'のミューテックスオブジェクトによる、FMO同時アクセスのブロックに対応し、安全性が増しています。

2003/04現在でこの'SakuraFMO'によるシンクロナイゼーションに対応している伺か関連ソフトウェアは、

です。

このコンポーネントは、取得したHWNDに対して、TDirectSSTPと併せて使うとより効果があります。

"Sakura"以外のFMOを読み取る機能があります。

SakuraSeekerはFMO先頭4バイトに定義されているFMOサイズを正しく解釈します(任意のサイズのFMOが扱えます)。

継承

TObject - TPersistent - TComponent - TSakuraSeeker

参照

TSakuraProcess

参考URL

TSakuraSeekerはこれらの仕様を参考にして設計されています。

伺か…メモリオブジェクト
http://sakura.wondernet.tv/objects.html

SSP技術資料…FMO関連の資料
http://ssp.shillest.net/docs/fmo.html

基本の使い方

起動中のゴースト名を列挙する

procedure Button1Click(Sender: TObject);
var i: integer;
begin
  with SakuraSeeker1 do
  begin
    BeginDetect;
    for i := 0 to Count-1 do
      ShowMessage('Name:' + Process[i].SetName + #13#10 +
        'HWND:'+ IntToStr(Process[i].HWnd));
  end;
end;

「さくら」という名前のゴーストを検索してウィンドウハンドル(DirectSSTP用)を得る

with SakuraSeeker1 do
begin
  BeginDetect;
  if ProcessByName['さくら'] <> nil then
    Handle := ProcessByName['さくら'].HWnd;
end;

リファレンス-メソッド

procedure BeginDetect;
最新のFMOにアクセスして中身を解析し、状態を保持します。Countプロパティが更新されます。
最新のFMO状態が必要なとき、直前に呼んでください。ただしFMOは時に100KB超に達することもありますので、あまり頻繁に呼びすぎるのも考え物です。
function KillFMO(const TargetFMOName, TargetID: String): boolean;
FMOから指定のプロセスIDを持つすべてのエントリを削除します。Mutexオブジェクトによる排他制御の問題に対応しています。
TargetFMONameにはFMO識別名(通常は「Sakura」)を、TargetIDにはプロセスID(MD5値など)を渡します。
エントリを削除した場合にtrueが返ります。指定したものが存在しない場合や、その他のエラーが発生した場合にはfalseが返ります。

リファレンス-プロパティ

property Count: integer;
実行時のみ、読み取り専用です。BeginDetectの後に意味を持ちます。発見されたプロセスの数を取得します。Processプロパティにアクセスする場合の添え字の上限として使用します。
property Process[Index: integer]: TSakuraProcess; default;
実行時のみ、読み取り専用です。見つかった順にTSakuraProcessのインスタンスを返します。
property ProcessByName[Name: String]: TSakuraProcess;
property ProcessBySetName[Name: String]: TSakuraProcess;
property ProcessByID[ID: String]: TSakuraProcess;
実行時のみ、読み取り専用です。それぞれ、TSakuraProcessのインスタンスを検索して返します。
ProcessByNameはnameをキーに検索します(例「さくら」)。同じ名前のものが2つ以上ある場合には最初に見つかったものが返ります。
ProcessBySetNameはname,keronameの組をキーにします。コンマで区切ります(例「さくら,うにゅう」)。同じ名前のものが2つ以上ある場合には最初に見つかったものが返ります。
ProcessByIDはプロセスIDをキーにします。(本来の仕様ではMD5値ですが、何らかのユニークな文字列が入ります)
property AutoDetect: boolean;
コンポーネントの生成時に自動的にBeginDetectするかどうかを設定します。
property FileMappingTarget: TStrings;
FMO識別名を設定します。デフォルトは「Sakura」です。複数の識別名を列挙することがで、その場合にはBeginDetectですべてが順に解析されます。

リファレンス-イベント

property OnGetMutexName: TSakuraSeekerGetMutexNameEvent;
TSakuraSeekerGetMutexNameEvent = procedure (Sender: TObject; var Name: String) of object;
排他制御用のミューテックスオブジェクトの名前をカスタマイズするためのイベントです。Nameパラメータに、これから解析しようとするFMOの識別名が入っているので(FileMappingTargetをカスタマイズしない限りは「Sakura」です)、そのFMOを保護するためのMutex識別名を、Nameに代入して終了してください(基本的には「SakuraFMO」)。このイベントを指定しない場合は、「SakuraFMO」というように、FMO識別名に「FMO」が付いたものをMutex識別名として利用します(標準の動作です)。
一応イベントとして実装してありますが、これをカスタマイズすると、Mutexを利用する意味自体がなくなりますので、本当に意味が分かっていて、必要がある場合のみ定義してください。
property OnAfterDetection: TNotifyEvent;
BeginDetect終了後に呼ばれます。
property OnDetectResultChanged: TNotifyEvent;
BeginDetectの後、その解析結果が前回の結果と違っていた場合に呼ばれます。このイベントに応じて、アプリケーションのコントロールを書き換えたり、ユーザにプロセスの起動・終了を通知したりすることができます。
FileMappingTargetで指定されるいずれかのFMOの中身が1バイトでも変わっていた場合に呼ばれることに注意してください。サーフィス番号を毎秒のようにFMOに登録するアプリケーションがありますので、プロセスの数や起動しているゴーストに全く変化がなくてもこれが呼ばれることがあります。

改版履歴

2003/04/18
Mutexオブジェクトによる、FMOの同時アクセス排他制御。