web-dev-qa-db-ja.com

コマンドプロンプトは、終了を待つタイミングをどのように認識しますか?

C#でWindowsコマンドプロンプトの再コード化を実行しようとしていました。コマンドプロンプトが、プロセスの終了を待機するタイミングと、呼び出されたプロセスの終了を待機しないタイミングをどのように認識しているか疑問に思いました。

たとえば、コマンドプロンプト「メモ帳」を入力すると、 メモ帳 が起動しますが、他のコマンドを実行することはできます。ただし、more.com、ping.exe、または別のユーティリティなどのユーティリティを開くと、実行中のプログラムが終了するのを待ってから、別のコマンドを実行できるようになります。

コマンドプロンプトは、終了を待機するタイミングをどのように認識し、この動作をC#でどのようにエミュレートできますか?

90
Justin Krejcha

アプリケーションがWin32GUIアプリケーションの場合、実行されるだけで、コマンドプロンプトはアプリケーションが終了するのを待ちません。

アプリケーションがコンソールアプリケーションの場合、コマンドプロンプトで実行され、コマンドプロンプトを取り戻すには、アプリケーションが終了するのを待つ必要があります。

編集:

OK。技術的な説明が必要なようです。アプリケーションで同じ機能をエミュレートする場合は、EXEファイルのIMAGE_OPTIONAL_HEADERを確認できます ここ

IMAGE_OPTIONAL_HEADERの中には、次のものがあります。

 Word                 Subsystem;

If SubSystem == 0x02それはGUIアプリケーションであることを意味します。

If SubSystem == 0x03それはコマンドプロンプトアプリであることを意味します。

編集2:

実際の動作を確認したい場合:

  1. ダウンロード http://www.ntcore.com/exsuite.php

  2. Calc.exeまたはnotepad.exeをデスクトップにコピーします

  3. コピーしたcalc.exeをCFFエクスプローラーで開きます

  4. Ntヘッダー->オプションのヘッダーに移動します

  5. サブシステムを0x002から0x003に変更します

  6. それを保存

ここで、新しく変更された計算を実行すると、コマンドプロンプトが終了するのを待ちます。

121

コマンドプロンプトのデフォルトでは、GUIプログラムを別のプロセス/フォークで生成します。ただし、コマンドプロンプト/シェルスクリプトを使用して、メモ帳(または他のGUIプログラム)をインラインで実行できます。

start /w notepad.exe

このように、コマンドPrompt/Shellスクリプトは、notepad.exeプロセスが終了した後にのみ続行されます。

これがお役に立てば幸いです、TW

8
Tw Bert

プロンプトの境界の外で実際に機能するこのコンテキストのGUIアプリケーションである新しいプロセスを開始すると、プロンプトは待機しません。ただし、プロンプトの現在のインスタンスの境界の下で完全に機能するコマンドを実行すると、待機します。

したがって、コマンドnotepadは、メモ帳アプリケーションを起動し、アプリケーションの制御を終了します。一方、コマンドipconfigは、プロンプトのドメイン(これは アプリケーションドメイン ではありません)で実行されます。

非常に一般化すると、同等のC#でProcess.Startを使用する場合は、待たないでください。とにかくしません。

3
danish