我在C++程序中使用ShellExecuteEx
函数来启动Uninstall.lnk文件。在我的程序中,我想等卸载程序完成。我第一次尝试将SEE_MASK_NOCLOSEPROCESS
标志设置为SHELLEXECUTEINFO
结构,然后调用WaitForSingleObject
将hProcess
控制柄中的SHELLEXECUTEINFO
结构传递给ShellExecuteEx
,但这似乎仍然过早返回。等待ShellExecuteEx(在Windows进程中设置访问权限)
我目前的怀疑是因为ShellExecuteEx启动的进程(是否启动一个新的shell?)会创建新的子进程,但不会等待它们。所以我试图创建一个“等待我的子进程并启动所有子进程”的功能。为此,我尝试使用作业对象。
我使用CreateJobObject
创建了一个作业对象,将ShellExecuteEx
返回的进程句柄分配给作业,然后尝试等待作业对象。不幸的是,将流程分配给作业失败,我认为这是由于访问权限不足。
有没有人知道如何在进程句柄上设置PROCESS_SET_QUOTA和PROCESS_TERMINATE访问权限(根据MSDN,AssignProcessToJobObject
需要成功),或者等待ShellExecuteEx启动的进程完成的另一种方式?
更新:我应该指出,我也推出了其他应用程序,而不仅仅是Uninstall.lnk
。其中之一是例如一个ClickOnce应用程序,它实际上是一个简单的XML文件,文件扩展名为.application
。
好点。的确,有时似乎(取决于我通过ShellExecuteEx启动的文件类型),启动的进程已经是作业对象的一部分。不幸的是,这是不可能的。 : -/ – 2009-07-17 14:36:00
好点。使用ShellExecuteEx的原因之一是将一大堆责任交给Shell。如果您想要更精确的控制,例如作业控制,请使用CreateProcess。 – MSalters 2009-07-17 14:37:38