C++プログラムでShellExecuteEx
関数を使用してUninstall.lnkファイルを起動しています。私のプログラムでは、アンインストーラが終了するのを待っています。私の最初の試みは、SHELLEXECUTEINFO
構造体にSEE_MASK_NOCLOSEPROCESS
フラグを設定し、SHELLEXECUTEINFO
構造体で利用可能なhProcess
ハンドルのWaitForSingleObject
をShellExecuteEx
に渡してコールしましたが、まだ早すぎるように見えました。ShellExecuteExを待つ(Windowsプロセスのアクセス権を設定する)
これは、ShellExecuteExによって起動されたプロセス(新しいシェルを起動しますか?)によって新しい子プロセスが作成されますが、それらは待機しないからです。だから私は "私の子プロセスとそれが起動するすべての子どもたちのための待つ"機能を作成しようとしています。そうするために、私はジョブオブジェクトを使用しようとしています。
CreateJobObject
を使用してジョブオブジェクトを作成し、ShellExecuteEx
によって返されたプロセスハンドルを割り当て、ジョブオブジェクトを待機しようとしました。残念ながら、プロセスをジョブに割り当てることができませんでした。これは、アクセス権が不十分なためです。
誰かが、プロセスハンドル上でAssignProcessToJobObject
が成功するために必要なPROCESS_SET_QUOTAおよびPROCESS_TERMINATEアクセス権を設定する方法を知っていますか?ShellExecuteExによって起動されたプロセスが終了するのを待つ別の方法はありますか?
更新:私は、Uninstall.lnk
以外の他のアプリケーションも起動していることを指摘しておきます。そのうちの1つは、 ClickOnceアプリケーションであり、実際にはファイル拡張子が.application
の単純なXMLファイルです。
良い点。実際、(ShellExecuteExを使って起動するファイルの種類によっては)起動したプロセスがすでにジョブオブジェクトの一部であるように見えます。残念ながら、この関連付けを解除することはできません。 : -/ –
良い点。 ShellExecuteExを使用する理由の1つは、シェル全体に多くの責任を負わせることです。ジョブ制御などのより正確な制御が必要な場合は、CreateProcessを使用します。 – MSalters