C#でWindowsコマンドプロンプトの再コード化を実行しようとしていました。コマンドプロンプトが、プロセスの終了を待機するタイミングと、呼び出されたプロセスの終了を待機しないタイミングをどのように認識しているか疑問に思いました。
たとえば、コマンドプロンプト「メモ帳」を入力すると、 メモ帳 が起動しますが、他のコマンドを実行することはできます。ただし、more.com、ping.exe、または別のユーティリティなどのユーティリティを開くと、実行中のプログラムが終了するのを待ってから、別のコマンドを実行できるようになります。
コマンドプロンプトは、終了を待機するタイミングをどのように認識し、この動作をC#でどのようにエミュレートできますか?
アプリケーションがWin32GUIアプリケーションの場合、実行されるだけで、コマンドプロンプトはアプリケーションが終了するのを待ちません。
アプリケーションがコンソールアプリケーションの場合、コマンドプロンプトで実行され、コマンドプロンプトを取り戻すには、アプリケーションが終了するのを待つ必要があります。
編集:
OK。技術的な説明が必要なようです。アプリケーションで同じ機能をエミュレートする場合は、EXEファイルのIMAGE_OPTIONAL_HEADER
を確認できます ここ 。
IMAGE_OPTIONAL_HEADER
の中には、次のものがあります。
Word Subsystem;
If SubSystem == 0x02
それはGUIアプリケーションであることを意味します。
If SubSystem == 0x03
それはコマンドプロンプトアプリであることを意味します。
編集2:
実際の動作を確認したい場合:
Calc.exeまたはnotepad.exeをデスクトップにコピーします
コピーしたcalc.exeをCFFエクスプローラーで開きます
Ntヘッダー->オプションのヘッダーに移動します
サブシステムを0x002から0x003に変更します
それを保存
ここで、新しく変更された計算を実行すると、コマンドプロンプトが終了するのを待ちます。
コマンドプロンプトのデフォルトでは、GUIプログラムを別のプロセス/フォークで生成します。ただし、コマンドプロンプト/シェルスクリプトを使用して、メモ帳(または他のGUIプログラム)をインラインで実行できます。
start /w notepad.exe
このように、コマンドPrompt/Shellスクリプトは、notepad.exeプロセスが終了した後にのみ続行されます。
これがお役に立てば幸いです、TW
プロンプトの境界の外で実際に機能するこのコンテキストのGUIアプリケーションである新しいプロセスを開始すると、プロンプトは待機しません。ただし、プロンプトの現在のインスタンスの境界の下で完全に機能するコマンドを実行すると、待機します。
したがって、コマンドnotepad
は、メモ帳アプリケーションを起動し、アプリケーションの制御を終了します。一方、コマンドipconfig
は、プロンプトのドメイン(これは アプリケーションドメイン ではありません)で実行されます。
非常に一般化すると、同等のC#でProcess.Start
を使用する場合は、待たないでください。とにかくしません。