1

メインプログラムからShellExecute関数で起動されたc++プログラムを終了するための最良の方法は何ですか?お気に入り..

 ShellExecute(hwnd, TEXT("open"), TEXT("c:\\tools\\123\\myProgram.exe"),
              TEXT(""), NULL, 0);

この場合、起動したプログラムは「my Program.exe」であり、終了したいと思います。メインプログラムと起動されたプログラムコンソールアプリケーションの両方がvc++で記述されています。

4

3 に答える 3

2

サブプログラムの場合:

int main(/*...*/) {
    //...
    return 0;
}

これをメインプログラムからプロセス間通信を介して、またはある種の制御シーケンスをサブプログラムに送信することによって行うように指示できますstdin。メッセージポンプがある場合は、 投稿WM_QUITまたは他のプロセスへの投稿も機能するはずです。WM_CLOSE

TerminateProcess()プログラムを終了しますが、それは確かに最善の方法ではありません。(クリーンアップは実行されません)

Exit(0)どちらも悪い方法ではありませんが、サブプログラムに終了するように指示する必要もあります。

于 2013-01-08T14:41:09.253 に答える
1

CreateProcessを使用してプロセスを生成する方がはるかに優れています。プロセスIDを使用して、生成されたプロセスを正常に終了できます。

子プロセスで、SetConsoleCtrlHandlerを呼び出してctrlハンドラーを登録します。ハンドルハンドルCTRL_CLOSE_EVENT。

子プロセスを終了する準備ができたら、CreateProcessにLPARAMとして渡したPROCESS_INFORMATION構造体から取得したプロセスIDを渡してEnumWindowsを呼び出します。

Windowsプロシージャを列挙するには、GetWindowThreadProcessIdを呼び出し、渡したLPARAMと比較します。一致する場合は、PostMessageまたはSendMessageを呼び出し、Windowsハンドル、WM_SYSCOMMANDメッセージ、SC_CLOSEコマンドをWPARAMとして、0をLPARAMとして渡します。

子プロセスはCTRL_CLOSE_EVENTコントロールタイプを受け取ります。ハンドラーで、戻る前に、クリーンアップを実行して終了する関数を呼び出します。その後、ハンドラーからTRUEを返します。

于 2013-01-09T14:36:40.303 に答える
1

最良の方法は、サブプロセスを通常どおり終了する(戻る)ことです。サブプロセスがどのような状態であるかを知ることはできないため、別のプロセスからプロセスを終了しようとするよりも常に優れています。イベントのようなカーネルオブジェクトを使用することも、サブプロセスで表示するためにファイルを作成することもできます。これにより、終了するように通知されます。

于 2013-01-08T14:56:32.943 に答える