在Wix MSI中:卸载时杀死进程

时间:2016-08-29 13:15:03

标签: wix windows-installer uninstall msiexec

我添加了一个自定义操作,当有人尝试使用以下代码在控制面板中使用add / remove将其卸载时,应使用taskkill CMD终止我的应用程序:

<Property Id="TASKKILL">
        <DirectorySearch Id="SysDir" Path="[SystemFolder]" Depth="1">
            <FileSearch Id="taskkillExe" Name="taskkill.exe" />
        </DirectorySearch>
</Property>

<CustomAction Id="ServerKill" Property="TASKKILL" Execute="immediate" Impersonate="yes" Return="ignore" ExeCommand="/F /FI &quot;IMAGENAME EQ App.exe&quot;"/>

<InstallExecuteSequence>
    <Custom Action="ServerKill" After="FindRelatedProducts"/>   
</InstallExecuteSequence>

然而,这不起作用。如果有人可以告诉我如何修复它,甚至分享更好/更简单的方法来杀死我的应用程序,我将不胜感激。

P.S
也尝试使用cmd使用WMIC。那真的没有用,因此安装本身根本没有完成。

2 个答案:

答案 0 :(得分:2)

也许您可以尝试使用Util模式中的 CloseApplication功能http://wixtoolset.org/documentation/manual/v3/xsd/util/closeapplication.html

请点击此处查看示例代码段:https://sourceforge.net/p/wix/mailman/message/20186650/

更新:我运行了一些测试,这个元素与我的预期有些不同。您需要添加的第一件事是对wixUtilExtension文件的引用。在命令行上,这是:

candle -ext WiXUtilExtension Test.wxs
light -ext WixUtilExtension Test.wixobj

Visual Studio 中,我认为您只需添加对 WixUtilExtension.dll 的项目引用。

然后你只需将这样的东西添加到你的wxs源文件中:

  <util:CloseApplication Id="CloseNotepad" Target="notepad.exe"
                         CloseMessage="yes" RebootPrompt="no">
  </util:CloseApplication>

并将其添加到wxs文件的顶部:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

看起来Wix负责其余部分(自定义操作和MSI中的自定义表以及要杀死的进程列表)。

这是我的完整测试文件:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

   <Product Id="*" UpgradeCode="12345678-1234-1234-1234-111111111111" 
            Name="Example Product Name" Version="0.0.1" Manufacturer="Example Company Name" Language="1033">
      <Package InstallerVersion="200" Compressed="yes" Comments="Windows Installer Package"/>
      <Media Id="1" Cabinet="product.cab" EmbedCab="yes"/>

      <Directory Id="TARGETDIR" Name="SourceDir">
         <Component Id="ApplicationFiles" Guid="*">
        </Component>
      </Directory>

      <Feature Id="DefaultFeature" Level="1">
         <ComponentRef Id="ApplicationFiles"/>
      </Feature>

      <util:CloseApplication Id="CloseNotepad" Target="notepad.exe" CloseMessage="yes" RebootPrompt="no"></util:CloseApplication>
   </Product>
</Wix>

答案 1 :(得分:0)

或者,计划在卸载时运行的简单VBScript应该完成这项工作:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colProcessList = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name = 'Notepad.exe'")

For Each objProcess in colProcessList
    objProcess.Terminate()
Next