4

ShellExecuteExC++ プログラムでこの関数を使用して、Uninstall.lnk ファイルを起動しています。私のプログラムでは、アンインストーラーが終了するのを待ちたいと思います。私の最初の試みは、構造体にSEE_MASK_NOCLOSEPROCESSフラグを設定してから、 に渡された構造体で使用可能なハンドルSHELLEXECUTEINFOを呼び出すことでしWaitForSingleObjectたが、それでも戻るのが早すぎたようです。hProcessSHELLEXECUTEINFOShellExecuteEx

私の現在の疑いは、これは、ShellExecuteEx によって起動されたプロセス (新しいシェルを起動しますか?) が新しい子プロセスを作成するが、それらを待機しないためであるということです。そのため、「子プロセスとそれが起動するすべての子プロセスを待機する」機能を作成しようとしています。そのために、ジョブ オブジェクトを使用しようとしています。

を使用してジョブ オブジェクトを作成し、CreateJobObjectによって返されたプロセス ハンドルをジョブに割り当ててShellExecuteExから、ジョブ オブジェクトを待機しようとしました。残念ながら、プロセスをジョブに割り当てることができませんでした。これは、アクセス権が不十分であることが原因だと思います。

PROCESS_SET_QUOTA および PROCESS_TERMINATE アクセス権 ( AssignProcessToJobObjectMSDN によると、成功するために必要) をプロセス ハンドルに設定する方法、または ShellExecuteEx によって起動されたプロセスが終了するのを待つ別の方法を知っている人はいますか?

更新:だけでなく、他のアプリケーションも起動していることを指摘しておく必要がありますUninstall.lnk。それらの 1 つは、たとえばClickOnceアプリケーションです。これは、事実上、ファイル拡張子が.application.

4

2 に答える 2

2

Vista は、リンクを起動するためにジョブ オブジェクトを使用します。そのため、別のジョブ オブジェクトに割り当てようとしたプロセスは、既に割り当てられている可能性があります。

参照:この質問

于 2009-07-17T09:31:30.213 に答える
1

開く代わりにターゲットファイルを実行しないのはなぜUninstall.lnkですか? IShellLinkショートカットターゲットを取得するために使用できます。SEE_MASK_NOCLOSEPROCESSその後、フラグを使用して ShellExecuteEx 経由でターゲット ファイルを実行できるようになります。

于 2009-07-17T10:34:49.587 に答える