2009-07-17 26 views
4

C++プログラムでShellExecuteEx関数を使用してUninstall.lnkファイルを起動しています。私のプログラムでは、アンインストーラが終了するのを待っています。私の最初の試みは、SHELLEXECUTEINFO構造体にSEE_MASK_NOCLOSEPROCESSフラグを設定し、SHELLEXECUTEINFO構造体で利用可能なhProcessハンドルのWaitForSingleObjectShellExecuteExに渡してコールしましたが、まだ早すぎるように見えました。ShellExecuteExを待つ(Windowsプロセスのアクセス権を設定する)

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

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

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

更新:私は、Uninstall.lnk以外の他のアプリケーションも起動していることを指摘しておきます。そのうちの1つは、 ClickOnceアプリケーションであり、実際にはファイル拡張子が.applicationの単純なXMLファイルです。

答えて

2

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

参照:this question

+0

良い点。実際、(ShellExecuteExを使って起動するファイルの種類によっては)起動したプロセスがすでにジョブオブジェクトの一部であるように見えます。残念ながら、この関連付けを解除することはできません。 : -/ –

+0

良い点。 ShellExecuteExを使用する理由の1つは、シェル全体に多くの責任を負わせることです。ジョブ制御などのより正確な制御が必要な場合は、CreateProcessを使用します。 – MSalters

1

なぜない代わりにopenning Uninstall.lnkのターゲットファイルを実行するには?あなたはIShellLinkを使ってショートカットターゲットを得ることができます。すると、SEE_MASK_NOCLOSEPROCESSフラグを使ってShellExecuteEx経由でターゲットファイルを実行することができます。

+0

ターゲットプロセスが別のプロセス(msiexec.exeなど)を生成して停止する場合、これは役に立ちません。 – Paul

+0

その後、 'msiexec.exe'を実行するか、インストーラAPIを使う方が良いでしょう。 –

+0

不正確です。 .lnkファイルだけでなく、他の種類のファイルも起動しています。また、通常の.exeファイルやClickOnceアプリケーション(.applicationファイル)も起動します。 –

関連する問題