4

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

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

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

有谁知道如何AssignProcessToJobObject在进程句柄上设置 PROCESS_SET_QUOTA 和 PROCESS_TERMINATE 访问权限(根据 MSDN,这是成功所必需的),或者以其他方式等待 ShellExecuteEx 启动的进程完成?

更新:我应该指出我也在启动其他应用程序,而不仅仅是Uninstall.lnk. 其中之一是ClickOnce应用程序,它实际上是一个带有文件扩展名的简单 XML 文件.application

4

2 回答 2

2

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

见:这个问题

于 2009-07-17T09:31:30.213 回答
1

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

于 2009-07-17T10:34:49.587 回答