在Wix MSI中:卸载时终止进程
我添加了一个自定义操作,当有人试图使用“控制面板”中的“添加/删除”命令(使用以下代码)卸载我的应用程序时,该操作应使用taskkill CMD终止该应用程序:在Wix MSI中:卸载时终止进程,wix,uninstallation,windows-installer,Wix,Uninstallation,Windows Installer,我添加了一个自定义操作,当有人试图使用“控制面板”中的“添加/删除”命令(使用以下代码)卸载我的应用程序时,该操作应使用taskkill CMD终止该应用程序: <Property Id="TASKKILL"> <DirectorySearch Id="SysDir" Path="[SystemFolder]" Depth="1"> <FileSearch Id="taskkillExe" Name="taskkill.exe
<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 "IMAGENAME EQ App.exe""/>
<InstallExecuteSequence>
<Custom Action="ServerKill" After="FindRelatedProducts"/>
</InstallExecuteSequence>
然而,这不起作用。如果有人能告诉我如何修复它,或者分享一种更好/更简单的方法来终止我的应用程序进程,我将不胜感激
p、 s还尝试使用cmd使用WMIC。这确实不起作用,因此安装本身根本没有完成。也许您可以从Util模式中尝试关闭应用程序功能: 有关示例代码段,请参见此处:
更新:我运行了一些测试,这个元素的工作原理与我预期的略有不同。首先需要添加对wixutil扩展名文件的引用。在命令行上,这是:
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>
也许您可以从Util模式中尝试关闭应用程序功能: 有关示例代码段,请参见此处:
更新:我运行了一些测试,这个元素的工作原理与我预期的略有不同。首先需要添加对wixutil扩展名文件的引用。在命令行上,这是:
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>
或者,计划在卸载时运行的简单VBScript应执行以下操作:
strComputer=“”
设置objWMIService=GetObject(“winmgmts:_
&“{impersonationLevel=impersonate}!\\”&strComputer&“\root\cimv2”)
设置colProcessList=objWMIService.ExecQuery_
(“从Win32_进程中选择*,其中名称='Notepad.exe')
对于colProcessList中的每个objProcess
objProcess.Terminate()
下一个
或者,计划在卸载时运行的简单VBScript应执行以下操作:
strComputer=“”
设置objWMIService=GetObject(“winmgmts:_
&“{impersonationLevel=impersonate}!\\”&strComputer&“\root\cimv2”)
设置colProcessList=objWMIService.ExecQuery_
(“从Win32_进程中选择*,其中名称='Notepad.exe')
对于colProcessList中的每个objProcess
objProcess.Terminate()
下一个
Hi,感谢您的重播,我签出了它,由于未知原因,我无法定义CloseApplication元素。我收到以下消息:Setup.wxs(35):错误CNDL0200:Product元素包含未处理的扩展元素“util:CloseApplication”。请确保已提供“”命名空间中元素的扩展。WixUI_InstallDirNoLicense.wxs light.exe:错误LGHT0093:在提供的中间体列表中找不到条目部分。应为“Product”类型的部分。我在上面的答案中添加了一些详细信息。您好,感谢重播将其签出,由于未知原因,我无法定义CloseApplication元素。我收到以下消息:Setup.wxs(35):错误CNDL0200:Product元素包含未处理的扩展元素“util:CloseApplication”。请确保已提供“”命名空间中元素的扩展。WixUI_InstallDirNoLicense.wxs light.exe:错误LGHT0093:在提供的中间体列表中找不到条目部分。应为“Product”类型的部分。我在上面的答案中添加了一些细节。