2012-01-11 19 views
4

私は、creatprocess api.Andで子プロセスを作成しています。私はjobobjectを作成し、この子プロセスをjobobjectに割り当てました。
親プロセスを終了すると、子プロセスも終了します。しかし、親プロセスを中断すると、子プロセスは中断せずに実行を継続します。
親プロセスが中断された場合、子プロセスを中断するオプションはありますか?私は、Windows APIの観点から子プロセスを中断する

Function ExecuteProcess(EXE : String) : THandle; 

Var 
SI  : TStartupInfo; 
PI  : TProcessInformation; 
Begin 
    Result := INVALID_HANDLE_VALUE; 
    FillChar(SI,SizeOf(SI),0); 
    SI.cb := SizeOf(SI); 
    If 
    CreateProcess(nil,PChar('.\'+EXE),nil,nil,False,CREATE_SUSPENDED, 
    nil,nil,SI,PI) Then 
    Begin 
    ResumeThread(PI.hThread); 
    CloseHandle(PI.hThread); 
    Result := PI.hProcess; 
    End 
    Else ShowMessage('CreateProcess failed: '+ 
        SysErrorMessage(GetLastError)); 
End; 
+3

ようこそで述べたようにあなたはまた、文書化されていないNtSuspendProcess機能を試してみてください。一度起動すると、何かを一時停止してはいけません。スレッドが*自体を一時停止している場合を除き、スレッドが停止しても安全であるかどうかは分かりません。それはIO操作の途中にある可能性があります。または、たとえば、メモリマネージャのロックを保持している可能性があります。あなたが解決しようとしている問題が何であれ、私は別の解決策を見つけることをお勧めします。あなたの問題を記述することができれば、ここでStack Overflowに投稿することができます。 –

+0

こんにちは。私の問題は、私はセキュリティアプリケーションを開発し、このアプリケーションはハードウェアで何らかの操作を行い、何かが間違っていると、それが作成したプロセスを終了しているということです。私の問題は、プロセスエクスプローラを使用してメインプロセスを中断した場合、作成したプロセスが実行を継続し、メインアプリケーションがそれらのプロセスを制御できなくなることです。セキュリティ管理はできません。そして、子プロセスは私によって開発されていない、私はそれらのソースコードを持っていない。 – galove

+0

私は新しい質問の投稿であなたの問題を説明することを意味しました。私はあなたの問題を理解していません。なぜあなたは最初にプロセスを中断しているのか分からなかった。 –

答えて

4

をプロセスを作成するために使用している

デルファイコード、プロセスを中断するようなものはありません。 スレッドのみを中断できますが、スレッド間に親子関係はありません。 「子スレッド」がないため、親が中断されたときにそれらを一時停止する自動メカニズムはありません。 (あなたはプロセスは中断を作成することができますが、それはそれが最初に作成されていますとき、一つだけのスレッドがありますので、だ、とそれが中断作成されます。)

を使用すると、子プロセスのすべてのスレッドを中断したい場合は、 enumerate themを実行し、親プロセスのスレッドをサスペンドするのと同じ方法でサスペンドします。

スタックオーバーフローWindows: Atomically suspend an entire process?

+0

ありがとう、しかし、どのようにこの操作を行うインターネットエクスプローラ?私はそれらの中に3つのブラウザと2つのタブを開いている。私が最初に作成したブラウザをプロセスエクスプローラで中断すると、それらのすべてが中断されます。メインブラウザの新しい開かれたブラウザスレッドですか? – galove

+0

はい、私はそう信じています。 Process Explorerでそのことを確認できませんか?新しいタブやウィンドウを開くと、別のプロセスエントリを取得するかどうかを確認します。 –

+0

新しいウィンドウを開くと、メインプロセスの下に新しいプロセスが表示されます。メインプロセスを中断した場合は、すべてのウィンドウが中断されます。スクリーンショット:http://s8.postimage.org/mjxu9ff11/image.jpg – galove

関連する問題