Jestem nowy w NSIS i muszę wiedzieć, że w deinstalatorze mogę sprawdzić, czy aplikacja (która jest w C++) jest uruchomiona i zamknąć ją przed odinstalowaniem.Sprawdzanie, czy aplikacja działa w NSIS przed odinstalowaniem
Odpowiedz
W zależności od zastosowania, masz kilka możliwości:
- Jeśli aplikacja ma okno z nieco unikalną nazwę klasy, można użyć FindWindow
- Jeśli aplikacja tworzy nazwanego obiektu jądra (Mutex itp) można sprawdzić dzwoniąc do niego poprawną natywne API win32 z wtyczką systemu
- Korzystanie 3rd party plugin jak FindProcDLL
Użyj wtyczki NsProcess. Pobierz go tutaj ->NSProcess
Jak z niego korzystać? Tak proste, jak:
${nsProcess::KillProcess} "${APP_EXE}" $R4
gdzie APP_EXE jest nazwą aplikacji ...
Pobieranie będzie również powiedzieć, jak go używać ... :)
Oto nieco bardziej wersja do korzystania NSProcess że żąda, aby zamknąć aplikację, a nie wypowie jej (odpowiedź Owena)
${nsProcess::FindProcess} "${APP_EXE}" $R0
${If} $R0 == 0
DetailPrint "${AppName} is running. Closing it down"
${nsProcess::CloseProcess} "${APP_EXE}" $R0
DetailPrint "Waiting for ${AppName} to close"
Sleep 2000
${Else}
DetailPrint "${APP_EXE} was not found to be running"
${EndIf}
${nsProcess::Unload}
Najlepszym rozwiązaniem! – MiBol
Wystarczy upewnić się, że pierwszą rzeczą, że instalacja lub un-i nstall robi to, aby usunąć wszystkie pliki xyz.tmp w% TEMP (lub innym katalogu zapisywalnym aplikacji) przed uruchomieniem pętli poniżej. Żadne wtyczki nie są wymagane.
!macro IsRunning
ExecWait "cmd /c for /f $\"tokens=1,2$\" %i in ('tasklist') do (if /i %i EQU xyz.exe fsutil file createnew $TEMP\xyz.tmp 0)"
IfFileExists $TEMP\xyz.tmp 0 notRunning
;we have atleast one main window active
MessageBox MB_OK|MB_ICONEXCLAMATION "XYZ is running. Please close all instances and retry." /SD IDOK
Abort
notRunning:
!macroEnd
FindProcDLL nie będzie działać z ostatniej wersji NSIS jak tego komentarza, 2,46, wydany w 2009 roku – Rex
Inną opcją jest to: 'ExecWait taskkill/IM nazwa programu/F' –