我在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文件。
答案 0 :(得分:2)
Vista使用作业对象启动链接。因此,您可能已经分配了尝试分配给另一个作业对象的过程。
请参阅:this question
答案 1 :(得分:1)
为什么不执行目标文件而不是打开Uninstall.lnk
?您可以使用IShellLink
来获取快捷方式目标。然后,您将能够使用SEE_MASK_NOCLOSEPROCESS
标志通过ShellExecute执行目标文件。