ShellExecuteEx
C++ プログラムでこの関数を使用して、Uninstall.lnk ファイルを起動しています。私のプログラムでは、アンインストーラーが終了するのを待ちたいと思います。私の最初の試みは、構造体にSEE_MASK_NOCLOSEPROCESS
フラグを設定してから、 に渡された構造体で使用可能なハンドルSHELLEXECUTEINFO
を呼び出すことでしWaitForSingleObject
たが、それでも戻るのが早すぎたようです。hProcess
SHELLEXECUTEINFO
ShellExecuteEx
私の現在の疑いは、これは、ShellExecuteEx によって起動されたプロセス (新しいシェルを起動しますか?) が新しい子プロセスを作成するが、それらを待機しないためであるということです。そのため、「子プロセスとそれが起動するすべての子プロセスを待機する」機能を作成しようとしています。そのために、ジョブ オブジェクトを使用しようとしています。
を使用してジョブ オブジェクトを作成し、CreateJobObject
によって返されたプロセス ハンドルをジョブに割り当ててShellExecuteEx
から、ジョブ オブジェクトを待機しようとしました。残念ながら、プロセスをジョブに割り当てることができませんでした。これは、アクセス権が不十分であることが原因だと思います。
PROCESS_SET_QUOTA および PROCESS_TERMINATE アクセス権 ( AssignProcessToJobObject
MSDN によると、成功するために必要) をプロセス ハンドルに設定する方法、または ShellExecuteEx によって起動されたプロセスが終了するのを待つ別の方法を知っている人はいますか?
更新:だけでなく、他のアプリケーションも起動していることを指摘しておく必要がありますUninstall.lnk
。それらの 1 つは、たとえばClickOnceアプリケーションです。これは、事実上、ファイル拡張子が.application
.