Delphi用コンポーネントです。
「何か。(仮)」に実装されているファイルマッピングオブジェクト(FMO)を利用し、安全に、現在起動している「何か。(仮)」プロセスのインスタンスを取得します。DirectSSTPやSakura APIを使うときのお供にどうぞ。
SSPにも対応している、はず(未確認)。
(C)2001 naruto/CANO-Lab
別ページにまとめるほどのものでもないので。
フォームに配置します。
BeginDetect メソッドを呼びだすことで、現在起動中のプロセスを取得して保持します。場合によってはTTimerコンポーネントと組み合わせて常に最新の結果を得ましょう。
BeginDetectが終了すれば、OnAfterDetection イベントが、さらにそれが前回の取得結果と異なっていた場合(と初回取得時)は、OnDetectResultChanged イベントが発生します(タイマーと組み合わせた場合に特に効果的)。
AutoDetect プロパティをtrueにしておけば、フォームのクリエイト時に自動的に BeginDetect が呼ばれます。
FileMappingTarget: TString プロパティは、ファイルマッピングオブジェクトの識別名リストです。"Sakura"の1行だけ入れておけばとりあえず大丈夫ですが、"ssp_Sakura"などを2行目以降に入れれば、それらも併せて、順番に検索します。(でも多分使わない)
んで、取り出した結果の取得方法ですが、3通りあり、どれも TSakuraProcess オブジェクトを返します。
property Count: integer read GetCount;
property Process[Index: integer]: TSakuraProcess; default;
この2つのプロパティを組み合わせることで、起動中のプロセスを順番に取得できます。
property ProcessByName[Name: String]: TSakuraProcess;
これは、「さくら」などのゴースト名から、プロセスを取得します。複数個見つかった場合は最初の1個だけ返します。見つからなければnilを返します。
property ProcessByID[ID: String]: TSakuraProcess;
こいつは、プロセスID(MD5値のあれ)から、同様にプロセスを取得します。見つからなければnilを返します。あんまり使い道なさそうですが。
TSakuraProcessは、Nameプロパティ(ゴースト名)、HWndプロパティ(ハンドル)、ProcessIDプロパティ(プロセスID)の各プロパティを持っています。
さらに、Data['name']形式(FMOの形式のまま)でも、Name,
HWndのほかに、将来突然拡張されるかもしれない各データにアクセスできます。
簡単な例。
if SakuraSeeker.ProcessByName['さくら'] <> nil then
Handle := SakuraSeeker.ProcessByName['さくら'].HWnd;
↑「さくら」というゴーストのプロセスを取得する
あとはDirectSSTPなりなんなりどうぞ。
//var i: integer;
for i := 0 to SakuraSeeker.Count-1 do Memo1.Lines.Add SakuraSeeker[i].Name;
↑起動中のゴーストの名前を列挙する