|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"子プロセスに自分を殺させる"
CreateProcessした子プロセスから自分をTerminateさせるためのコード.
Handle を他のプロセスに渡すには DuplicateHandle を呼ばないといけないので
その例です.W2Kで確認
-----------------------------------------------------------------------------
<死にたい人のコード>
uses Windows
var
SecAttr: TSecurityAttributes;
procedure TForm1.DoXXXX;
var
Si: TStartupInfo;
Pi: TProcessInformation;
Ph: THandle;
FName: string;
St: TStringList;
begin
FName := 'D:\MyApps\ChildApp.exe';
GetStartupInfo(Si);
SecAttr.bInheritHandle := True;
SecAttr.nLength := Sizeof(SecAttr);
if Windows.CreateProcess( nil,
PChar( FName ), // コマンドラインをそのまま書く
@SecAttr, @SecAttr, True,
CREATE_DEFAULT_ERROR_MODE,
nil, PChar(GetCurrentDir), Si, Pi)
then begin
// Pi は子プロセスのinfo,自プロセス内のハンドルを子プロセスに渡すため
// 継承ハンドルを Ph に得る
DuplicateHandle( GetCurrentProcess, GetCurrentProcess, Pi.hProcess,
@Ph, 0, False, DUPLICATE_SAME_ACCESS );
// 継承済みのハンドルを子プロセスに渡すのにファイルを使った例
St := TStringList.Create
try
St.Add( InttoStr( Ph ) );
St.SaveToFile('D:\MyApps\Handle.txt');
finally
St.Free;
end;
end;
end;
---------------------------------------------------------------------------
<殺し請負をするプロセスのコード>
var
hProcess: THandle;
St: TStringList;
begin
St := TStringList.Create
try
St.LoadFromFile('D:\MyApps\Handle.txt');
hProcess := StrToInt( ProcInfo[0] );
finally
St.Free;
end;
TerminateProcess( hProcess, 0 );
end;
TN(CQJ01721)
Original document by TN 氏 ID:(CQJ01721)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|