伺か互換システムのFile-mapping Object(通称FMO)を利用して、現在のローカルマシンで起動している伺か互換システムの情報を取得します。
2003/04 より、'SakuraFMO'のミューテックスオブジェクトによる、FMO同時アクセスのブロックに対応し、安全性が増しています。
2003年04月現在でこの'SakuraFMO'によるシンクロナイゼーションに対応している伺か関連ソフトウェアは、
です。
このコンポーネントは、取得したHWNDに対して、TDirectSSTPと併せて使うとより効果があります。
"Sakura"以外のFMOを読み取る機能があります。
SakuraSeekerはFMO先頭4バイトに定義されているFMOサイズを正しく解釈します(任意のサイズのFMOが扱えます)。
TObject - TPersistent - TComponent -
TSakuraSeeker
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;
with SakuraSeeker1 do
begin
BeginDetect;
if ProcessByName['さくら'] <> nil then
Handle := ProcessByName['さくら'].HWnd;
end;
Countプロパティが更新されます。TargetFMONameにはFMO識別名(通常は「Sakura」)を、TargetIDにはプロセスID(MD5値など)を渡します。BeginDetectの後に意味を持ちます。発見されたプロセスの数を取得します。Processプロパティにアクセスする場合の添え字の上限として使用します。TSakuraProcessのインスタンスを返します。TSakuraProcessのインスタンスを検索して返します。ProcessByNameはnameをキーに検索します(例「さくら」)。同じ名前のものが2つ以上ある場合には最初に見つかったものが返ります。ProcessBySetNameはname,keronameの組をキーにします。コンマで区切ります(例「さくら,うにゅう」)。同じ名前のものが2つ以上ある場合には最初に見つかったものが返ります。ProcessByIDはプロセスIDをキーにします。(本来の仕様ではMD5値ですが、何らかのユニークな文字列が入ります)BeginDetectするかどうかを設定します。BeginDetectですべてが順に解析されます。TSakuraSeekerGetMutexNameEvent = procedure (Sender: TObject; var
Name: String) of object;Nameパラメータに、これから解析しようとするFMOの識別名が入っているので(FileMappingTargetをカスタマイズしない限りは「Sakura」です)、そのFMOを保護するためのMutex識別名を、Nameに代入して終了してください(基本的には「SakuraFMO」)。このイベントを指定しない場合は、「SakuraFMO」というように、FMO識別名に「FMO」が付いたものをMutex識別名として利用します(標準の動作です)。BeginDetect終了後に呼ばれます。BeginDetectの後、その解析結果が前回の結果と違っていた場合に呼ばれます。このイベントに応じて、アプリケーションのコントロールを書き換えたり、ユーザにプロセスの起動・終了を通知したりすることができます。FileMappingTargetで指定されるいずれかのFMOの中身が1バイトでも変わっていた場合に呼ばれることに注意してください。サーフィス番号を毎秒のようにFMOに登録するアプリケーションがありますので、プロセスの数や起動しているゴーストに全く変化がなくてもこれが呼ばれることがあります。