[英]Waiting for ShellExecuteEx (Setting access rights on Windows process)
我在C ++程序中使用ShellExecuteEx
函数来启动Uninstall.lnk文件。 在我的程序中,我想等待卸载程序完成。 我的第一次尝试是在SHELLEXECUTEINFO
结构中设置SEE_MASK_NOCLOSEPROCESS
标志,然后在传递给ShellExecuteEx
的SHELLEXECUTEINFO
结构中的hProcess
句柄上调用WaitForSingleObject
,但这似乎仍然过早地返回。
我当前的怀疑是,这是因为ShellExecuteEx启动的进程(它是否启动了一个新的shell?)会创建新的子进程,但不会等待它们。 因此,我正在尝试创建一个“等待我的子进程及其启动的所有子进程”功能。 为此,我正在尝试使用作业对象。
我使用CreateJobObject
创建了一个作业对象,将ShellExecuteEx
返回的进程句柄分配给作业,然后尝试等待作业对象。 不幸的是,将进程分配给作业失败了,我认为这是由于访问权限不足。
有没有人知道如何在进程句柄上设置PROCESS_SET_QUOTA和PROCESS_TERMINATE访问权限( AssignProcessToJobObject
需要成功,根据MSDN),或者等待ShellExecuteEx启动的进程完成的另一种方法?
更新:我应该指出,我也在推出其他应用程序,而不仅仅是Uninstall.lnk
。 其中一个是例如ClickOnce应用程序,它实际上是一个文件扩展名为.application
的简单XML文件。
Vista使用作业对象来启动链接。 因此,您可能已经分配了尝试分配给另一个作业对象的进程。
见: 这个问题
为什么不执行目标文件而不是打开Uninstall.lnk
? 您可以使用IShellLink
获取快捷方式目标。 然后,您将能够使用SEE_MASK_NOCLOSEPROCESS
标志通过ShellExecuteEx执行目标文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.