1

ShellExecuteを使用してC++からアプリケーションを生成しているので、アプリのHINSTANCEがあります。

そのHINSTANCEを使用して今それを閉じるにはどうすればよいですか?また、WaitForSingleObject()を使用して、アプリが終了するのを待つことはできますか?

4

2 に答える 2

3

プロセスを正常にシャットダウンする方法はありません。を使用することで突然非優雅な方法がありますが、TerminateProcessこれによりプロセスが独自のクリーンアップコードを実行できなくなり、「処理不能」になる可能性があります。WindowsXPでプロセスが終了する方法の概要を参照してください。

長い間、「プロセスの終了」に関する一般的な知恵は、アプリケーションが正常に終了することで応答することを期待して、WM_CLOSEをプロセスの最上位の所有されていないウィンドウに送信することでした。Win32でアプリケーションを「クリーンに」終了する方法、および適切なウィンドウを見つけるという関連する主題に関するこの必須の読み物を参照してください。複数(またはゼロ)の場合があります:プロセスをウィンドウに変換する

また、ShellExecute関数によって返されるHINSTANCEで何ができるかを読む必要がありますか?あなたが持っているHINSTANCEが信頼できない理由を理解するために、役に立たないことは言うまでもありません...

于 2011-05-19T20:43:25.843 に答える
1

まず第一に、HINSTANCEWindowsの最新バージョンではほとんど役に立ちませんが、HINSTANCEとにかく実際には使用できません。からの戻りShellExecute値は、実際には32より大きいか小さい値であり、それぞれ成功または失敗を示します。

幸い、を使用するShellExecuteExと、新しいプロセスのプロセスハンドルを取得でき、それを使用してプロセスを制御できます。

@RemusがリンクしたMSDNの記事はまともですが、(IMO)ターゲットアプリケーションがコンソールアプリケーションである(またはそうである可能性がある)場合に役立つ別の手順があります。この場合、通常はWM_CLOSEメッセージを処理しません。ただし、DLLをプロセスに挿入し、プロセス内からクリーン(ish)シャットダウンを実行させることはできます(たとえば、を呼び出しexit、ターゲットプログラムがCで記述されている場合、次のことが可能になります。atexit死ぬ前に、ファイルをフラッシュして閉じたり、に登録されているものを実行したりします)。

それが失敗した場合はGenerateConsoleCtrlEvent、コントロールブレークを送信するために使用することをお勧めします。

次に、それらすべてが終了しない場合は、を呼び出しますTerminateProcess

于 2011-05-19T21:46:57.400 に答える