2009-07-17 2 views
4

C++ 프로그램에서 ShellExecuteEx 함수를 사용하여 Uninstall.lnk 파일을 시작합니다. 내 프로그램에서 제거 프로그램이 끝날 때까지 기다리고 싶습니다. 내 첫번째 시도는 SHELLEXECUTEINFO 구조에 SEE_MASK_NOCLOSEPROCESS 플래그를 설정 한 다음 SHELLEXECUTEINFO 구조에서 사용 가능한 hProcess 핸들의 WaitForSingleObjectShellExecuteEx에 전달했지만 여전히 너무 일찍 반환하는 것처럼 보였습니다.ShellExecuteEx를 기다리는 중 (Windows 프로세스에서 액세스 권한 설정)

내 현재의 의문은 ShellExecuteEx (새 셸을 시작합니까?)에서 시작한 프로세스가 새 하위 프로세스를 만들지 만 대기하지 않기 때문입니다. 그래서 나는 "내 자식 프로세스와 그 자식이 시작하는 모든 아이들을 기다리는"함수를 만들려고합니다. 이렇게하려면 작업 개체를 사용하려고합니다.

CreateJobObject을 사용하여 작업 개체를 만들고 ShellExecuteEx에 의해 반환 된 프로세스 핸들을 할당 한 다음 작업 개체를 기다리려고했습니다. 불행히도 프로세스를 작업에 할당하지 못했습니다. 이는 액세스 권한 부족으로 인한 것 같습니다.

사람은 프로세스 핸들 또는 완료 ShellExecuteEx에 의해 발사 과정을 기다릴 수있는 또 다른 방법에 (은 MSDN에 따르면, 성공 AssignProcessToJobObject 필요)을 PROCESS_SET_QUOTA 및 PROCESS_TERMINATE 액세스 권한을 설정하는 방법을 알고 있나요?

업데이트 : 나는 Uninstall.lnk이 아닌 다른 응용 프로그램도 실행 중임을 지적해야합니다. 그 중 하나가 예를 들어. ClickOnce 응용 프로그램은 사실상 파일 확장자가 .application 인 단순한 XML 파일입니다.

답변

2

Vista는 링크 실행을 위해 작업 개체를 사용합니다. 따라서 다른 작업 개체에 할당하려고 시도하는 프로세스가 이미 할당되었을 수 있습니다.

참조 : this question

+0

좋은 지적. 사실, 가끔 (ShellExecuteEx를 통해 실행하는 파일의 종류에 따라) 실행 된 프로세스가 이미 작업 객체의 일부인 것처럼 보입니다. 불행히도이 연관성을 깨뜨리는 것은 불가능합니다. : -/ –

+0

좋은 지적. ShellExecuteEx를 사용하는 이유 중 하나는 Shell에게 많은 책임을 넘기는 것입니다. 작업 제어와 같은보다 정밀한 제어가 필요하면 CreateProcess를 사용하십시오. – MSalters

1

왜 대신 열리는 Uninstall.lnk의 대상 파일을 실행하려면? 바로 가기 대상을 얻으려면 IShellLink을 사용할 수 있습니다. 그러면 SEE_MASK_NOCLOSEPROCESS 플래그를 사용하여 ShellExecuteEx를 통해 대상 파일을 실행할 수 있습니다.

+0

대상 프로세스가 msiexec.exe와 같은 다른 프로세스를 생성하고 종료되면이 작업이 도움이되지 않습니다. – Paul

+0

그러면 msiexec.exe를 실행하거나 installer API를 사용하는 것이 더 좋습니다. –

+0

부정확을 유감스럽게 생각합니다. 또한 .lnk 파일뿐만 아니라 다른 유형의 파일도 시작합니다. 또한 ClickOnce 응용 프로그램 (.application 파일)뿐만 아니라 일반 .exe 파일도 실행합니다. –

관련 문제