2016-08-29 7 views
0

Я добавил пользовательское действие, которое должно убить мое приложение с помощью Taskkill CMD, когда кто-то пытается удалить его с помощью добавления/удаления в панели управления, используя следующий код:В Wix MSI: Убийство процесса при удалении

<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
также пытался использовать WMIC с помощью ЦМД. Из-за этого это действительно не сработало, и сама установка не закончилась.

ответ

2

Может быть, вы можете попробовать функцию CloseApplication из схемы Util: http://wixtoolset.org/documentation/manual/v3/xsd/util/closeapplication.html

Смотрите здесь для примера фрагмент кода: https://sourceforge.net/p/wix/mailman/message/20186650/


UPDATE: Я провел несколько тестов, и этот элемент работы немного иначе, чем я ожидал. Первое, что вам нужно добавить, это ссылка на файл 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> 
+0

Привет, Спасибо за повтор проверил и я не могу определить элемент CloseApplication по неизвестной причине. Я получаю следующее сообщение: Setup.wxs (35): ошибка CNDL0200: элемент Product содержит необработанный элемент расширения 'util: CloseApplication'. Убедитесь, что указано расширение для элементов в пространстве имен «http://schemas.microsoft.com/wix/UtilExtension». WixUI_InstallDirNoLicense.wxs light.exe: ошибка LGHT0093: Не удалось найти раздел ввода в списке промежуточных продуктов. Ожидаемый раздел типа «Продукт». – Zaya3161

+0

Я добавил некоторые подробности в ответ выше. –

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