2009-07-17 123 views
4

我在C++程序中使用ShellExecuteEx函数来启动Uninstall.lnk文件。在我的程序中,我想等卸载程序完成。我第一次尝试将SEE_MASK_NOCLOSEPROCESS标志设置为SHELLEXECUTEINFO结构,然后调用WaitForSingleObjecthProcess控制柄中的SHELLEXECUTEINFO结构传递给ShellExecuteEx,但这似乎仍然过早返回。等待ShellExecuteEx(在Windows进程中设置访问权限)

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

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

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

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

回答

2

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

参见:this question

+0

好点。的确,有时似乎(取决于我通过ShellExecuteEx启动的文件类型),启动的进程已经是作业对象的一部分。不幸的是,这是不可能的。 : -/ – 2009-07-17 14:36:00

+0

好点。使用ShellExecuteEx的原因之一是将一大堆责任交给Shell。如果您想要更精确的控制,例如作业控制,请使用CreateProcess。 – MSalters 2009-07-17 14:37:38

1

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