wix - WindowsFolder 属性作为 exe 地址的一部分不起作用

标签 wix installation

试图让一个 wix 安装程序终止一个进程,从我在网上找到的内容来看,这似乎是要走的路:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="WindowsFolder" Name="WINDOWS"/>

<Property Id="QtExecCmdLine" Value='"[WindowsFolder]System32\taskkill.exe" /F /IM Foo.exe'/>
<CustomAction Id="KillTaskProcess" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="immediate" Return="ignore"/>

我遇到的问题是构建项目会抛出以下错误,提示 windows 属性:

The 'QtExecCmdLine' Property contains '[WindowsFolder]' in its value which is an illegal reference to another property.  If this value is a string literal, not a property reference, please ignore this warning.  To set a property with the value of another property, use a CustomAction with Property and Value attributes. 

我试过 [#WindowsFolder],它消除了错误,但没有解决问题。 使用完整地址 (C:\Windows\System32\taskkill.exe) 代替该值确实有效,但我想避免这种情况。

最佳答案

我认为您不能像现在这样引用目录(例如“[WindowsFolder]”)。这种类型的注释用于引用属性的值。

WindowsInstaller 确实已经提供了一个公共(public)属性,它表示任何给定系统上的系统文件夹。 您可以使用 [SystemFolder]在 32 位机器上获取 c:\Windows\System32(注意在 64 位机器上这将为您提供 c:\Windows\SysWow64)。
因此,在 64 位机器上你可以使用 [System64Folder]这会给你 c:\Windows\System32

你的代码看起来像

<Property Id="QtExecCmdLine" Value='"[SystemFolder]taskkill.exe" /F /IM Foo.exe'/>

或者

<Property Id="QtExecCmdLine" Value='"[System64Folder]taskkill.exe" /F /IM Foo.exe'/>


我在同时支持 32 和 64 位机器的安装包中执行了类似的操作。这使事情稍微复杂化了。
为了解决这个问题,我会尝试使用您的代码执行以下操作:

<Property Id="TASKKILLFILEPATH"/>
<Property Id="QtExecCmdLine" Value='"[TASKKILLFILEPATH]" /F /IM Foo.exe'/>

然后,添加一个自定义 Action 来正确设置任务kill文件路径

<CustomAction Id='SetTASKKILLFILEPATH32' Property='TASKKILLFILEPATH' Value='[SystemFolder]\taskkill.exe' Return='check' />
<CustomAction Id='SetTASKKILLFILEPATH64' Property='TASKKILLFILEPATH' Value='[System64Folder]\taskkill.exe' Return='check' />

在 InstallExecuteSequence 中,您可以根据系统类型运行适当的自定义操作:

<InstallExecuteSequence>
      <Custom Action='SetTASKKILLFILEPATH64' After='AppSearch'>VersionNT64</Custom>
      <Custom Action='SetTASKKILLFILEPATH32' After='AppSearch'>Not VersionNT64</Custom>
</InstallExecuteSequence>

BTW VersionNT64 是另一个 WindowsInstaller 提供的属性。

这可能有点矫枉过正,我希望有其他人可能会分享的更简单的方法,但我知道这是一个可行的解决方案。希望这至少能引导您正确的方向。

关于wix - WindowsFolder 属性作为 exe 地址的一部分不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24953857/

相关文章:

parameters - WiX 和启动程序 - 是否可以传递参数?

wix - Visual C++ 2015 可再发行软件包后,Windows 10 上没有 api-ms-win-crt-runtime-l1-1-0.dll

javascript - Aurelia - 无法使用 typescript skeeton 使 asp net core 工作

python - 向spyder添加文档(python IDE)

installation - Windows 安装程序包的问题

android - 使用 Eclipse 编写了两个 Android 应用程序。不能同时安装吗?

windows - 如何从启用了 "Run as Administrator"的基于 WiX 的安装程序安装桌面快捷方式(到批处理文件)?

xml - 使用 XSLT 修改 .wxs 中的 heat

installation - 卸载后桌面图标不会被删除 - Wix

WiX Heat 预构建错误