等待ShellExecuteEx(在Windows进程上设置访问权限)

时间:2009-07-17 09:25:56

标签: c++ windows process shellexecute

我在C ++程序中使用ShellExecuteEx函数来启动Uninstall.lnk文件。在我的程序中,我想等待卸载程序完成。我的第一次尝试是在SEE_MASK_NOCLOSEPROCESS结构中设置SHELLEXECUTEINFO标记,然后在传递给{{WaitForSingleObject结构的hProcess句柄上调用SHELLEXECUTEINFO 1}},但这似乎还为时过早。

我目前的怀疑是,这是因为ShellExecuteEx启动的进程(是否启动了新的shell?)会创建新的子进程,但不会等待它们。因此,我正在尝试创建一个“等待我的子进程及其启动的所有子进程”功能。为此,我正在尝试使用作业对象。

我使用ShellExecuteEx创建了一个作业对象,将CreateJobObject返回的进程句柄分配给作业,然后尝试等待作业对象。不幸的是,将进程分配给作业失败了,我认为这是由于访问权限不足。

是否有人知道如何在进程句柄上设置PROCESS_SET_QUOTA和PROCESS_TERMINATE访问权限(ShellExecuteEx成功,根据MSDN),或等待ShellExecuteEx启动的进程的另一种方式完成?

更新:我应该指出,我也在推出其他应用程序,而不仅仅是AssignProcessToJobObject。其中一个是例如一个ClickOnce应用程序,它实际上是一个文件扩展名为Uninstall.lnk的简单XML文件。

2 个答案:

答案 0 :(得分:2)

Vista使用作业对象启动链接。因此,您可能已经分配了尝试分配给另一个作业对象的过程。

请参阅:this question

答案 1 :(得分:1)

为什么不执行目标文件而不是打开Uninstall.lnk?您可以使用IShellLink来获取快捷方式目标。然后,您将能够使用SEE_MASK_NOCLOSEPROCESS标志通过ShellExecute执行目标文件。