NSIS를 사용하여 새 버전을 설치하기 전에 이전에 설치 한 버전의 설치 제거 프로그램을 설치 프로그램에서 호출하고 싶습니다. 이에 대한 proposed solution 다음 명령을 실행하는 것입니다NSIS 설치 프로그램에서 NSIS 설치 제거 프로그램이 완료 될 때까지 기다리는 중 실패하거나 제거 프로그램이 삭제되지 않습니다.
ExecWait '"$INSTDIR\uninstall.exe" _?=$INSTDIR'
지금까지 내가 이해 한, _?=$INSTDIR
가 ExecWait
이 진정으로 대기 할 필요가있다. 이 파일이 없으면 NSIS는 제거 프로그램을 임시 디렉토리에 복사하고 거기서 시작한 다음 제거 프로그램이 끝나기 전에 되돌아갑니다. 이 해결책의 문제점은 제거 프로그램이 $ INSTDIR에서 직접 실행된다는 것입니다.
Delete "$INSTDIR\uninstall.exe"
를 지금까지 내가 이해로, uninstall.exe
가 삭제되지 않는 이유는 현재 실행중인 파일이 삭제되지 않을 수있다 : 이것은 내 제거 프로그램에서 다음 명령이 실패 효과로 이어집니다. 내 문제를 요약 : 제거가 완료 될 때까지
ExecWait '"$INSTDIR\uninstall.exe"'
기다리지 않습니다 및
ExecWait '"$INSTDIR\uninstall.exe" _?=$INSTDIR'
은 제거 프로그램 자체를 삭제하는 것을 허용하지 않습니다. 누군가 제거 프로그램이 제거 프로세스에서 즉시 삭제할 수 있도록 동시에 제거 프로그램이 완료 될 때까지 기다리는 방법을 알고 있습니까?
ExecWait는 항상 내가 ExecWait 만 제거 될 때까지 기다리는 읽어 – Anders
...이 자식 프로세스 그냥 빨리 완료 귀하의 경우, 자식 프로세스를 기다린다 temp 디렉토리에 복사되고 시작됩니다. 그것은 확실히 finsih에 제거 프로그램을 기다리지 않습니다. 나는 이것을 몇몇 메시지 박스를 사용하여 시험했다. – honk
ExecWait은 일반 명령이며 항상 자식 프로세스를 기다립니다. 실행 한 (제거 프로그램) 항목이 신속하게 종료된다는 사실은 ExecWaits 오류가 아닙니다. ExecWait은 기본 CreateProcess 및 WaitForSingleObject 함수를 둘러싼 씬 래퍼입니다. – Anders