C++ 프로그램에서 ShellExecuteEx
함수를 사용하여 Uninstall.lnk 파일을 시작합니다. 내 프로그램에서 제거 프로그램이 끝날 때까지 기다리고 싶습니다. 내 첫번째 시도는 SHELLEXECUTEINFO
구조에 SEE_MASK_NOCLOSEPROCESS
플래그를 설정 한 다음 SHELLEXECUTEINFO
구조에서 사용 가능한 hProcess
핸들의 WaitForSingleObject
을 ShellExecuteEx
에 전달했지만 여전히 너무 일찍 반환하는 것처럼 보였습니다.ShellExecuteEx를 기다리는 중 (Windows 프로세스에서 액세스 권한 설정)
내 현재의 의문은 ShellExecuteEx (새 셸을 시작합니까?)에서 시작한 프로세스가 새 하위 프로세스를 만들지 만 대기하지 않기 때문입니다. 그래서 나는 "내 자식 프로세스와 그 자식이 시작하는 모든 아이들을 기다리는"함수를 만들려고합니다. 이렇게하려면 작업 개체를 사용하려고합니다.
CreateJobObject
을 사용하여 작업 개체를 만들고 ShellExecuteEx
에 의해 반환 된 프로세스 핸들을 할당 한 다음 작업 개체를 기다리려고했습니다. 불행히도 프로세스를 작업에 할당하지 못했습니다. 이는 액세스 권한 부족으로 인한 것 같습니다.
사람은 프로세스 핸들 또는 완료 ShellExecuteEx에 의해 발사 과정을 기다릴 수있는 또 다른 방법에 (은 MSDN에 따르면, 성공 AssignProcessToJobObject
필요)을 PROCESS_SET_QUOTA 및 PROCESS_TERMINATE 액세스 권한을 설정하는 방법을 알고 있나요?
업데이트 : 나는 Uninstall.lnk
이 아닌 다른 응용 프로그램도 실행 중임을 지적해야합니다. 그 중 하나가 예를 들어. ClickOnce 응용 프로그램은 사실상 파일 확장자가 .application
인 단순한 XML 파일입니다.
좋은 지적. 사실, 가끔 (ShellExecuteEx를 통해 실행하는 파일의 종류에 따라) 실행 된 프로세스가 이미 작업 객체의 일부인 것처럼 보입니다. 불행히도이 연관성을 깨뜨리는 것은 불가능합니다. : -/ –
좋은 지적. ShellExecuteEx를 사용하는 이유 중 하나는 Shell에게 많은 책임을 넘기는 것입니다. 작업 제어와 같은보다 정밀한 제어가 필요하면 CreateProcess를 사용하십시오. – MSalters