[英]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.