在卸载之前检查应用程序是否在NSIS中运行

时间:2010-04-02 05:58:37

标签: nsis

我是NSIS的新手,我需要知道在卸载程序中,如何检查应用程序(使用C ++)是否正在运行并在卸载之前将其关闭。

4 个答案:

答案 0 :(得分:8)

这是一个稍微友好的版本,使用NSProcess请求关闭而不是终止它(Owen的回答)

${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}

答案 1 :(得分:7)

使用NsProcess插件。在这里下载 - > NSProcess
如何使用它?简单如下:

${nsProcess::KillProcess} "${APP_EXE}" $R4

其中APP_EXE是您的应用程序的名称......

下载也会告诉你如何使用它......:)

答案 2 :(得分:1)

根据应用程序的不同,您有几个选择:

  • 如果您的应用程序的窗口具有某种独特的类名,则可以使用FindWindow
  • 如果您的应用程序创建了一个命名的内核对象(Mutex等),您可以通过使用系统插件调用正确的本机win32 API来检查它;
  • 使用第三方插件,例如FindProcDLL

答案 3 :(得分:1)

只需确保安装或卸载的第一件事就是删除%TEMP(或任何其他应用程序可写目录)中的所有xyz.tmp文件,然后再运行以下for循环。无需插件。

!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