2010-04-02 9 views

Odpowiedz

1

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
+0

FindProcDLL nie będzie działać z ostatniej wersji NSIS jak tego komentarza, 2,46, wydany w 2009 roku – Rex

+3

Inną opcją jest to: 'ExecWait taskkill/IM nazwa programu/F' –

7

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ć ... :)

7

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} 
+0

Najlepszym rozwiązaniem! – MiBol

0

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 
Powiązane problemy