从自定义操作中获取目标文件路径

时间:2015-12-17 00:08:43

标签: wix windows-installer custom-action

如何从WiX自定义操作中获取文件的路径?

我正在创建一个 WIX扩展,它有一个自定义元素,可以嵌套在<File>组件下,如下所示:

<Component Id="FooComponent">
   <File Id="filekey" Name="foo.txt">
       <myextension:Stuff />
   </File>
</Component>

扩展程序有自定义表,其外键列指向&#34;组件&#34;和&#34;文件&#34;表,并在安装/卸载文件组件时执行(例如内置的IIS扩展或SQL扩展)

我想要实现的是,在我的延迟(sheduled)自定义操作中,找出扩展名绑定到的文件的目标路径。即基本上在不同的自定义操作中,我希望得到[!filekey]的值(就MSI formatted字符串而言)。我怎么能这样做呢?

我找到了一个类似的主题here

建议的解决方案之一是使用自定义操作中的MsiFormatRecord并将[#filekey]传递给该函数。它然后解析得很好。

我已经在WiX来源,游戏扩展和NetFX扩展中找到了使用此方法的示例;他们使用这样的代码:

    StrAllocFormatted(&pwzFormattedFile, L"[#%s]", pwzFileId);
    WcaGetFormattedString(pwzFormattedFile, &pwzGamePath);

此处WcaGetFormattedString基本上是MsiFormatRecord

的包装器

仍然没有答案,这是解决问题的正确方法吗?

1 个答案:

答案 0 :(得分:0)

基本上,您将[!filekey]传递给该格式的延迟自定义操作,使用CustomActionData间接方式执行此操作。然后在您的自定义操作中,您将获得属性值[CustomActionData]。这可能会有所帮助:

How to pass CustomActionData to a CustomAction using WiX?

要拼写出来,如果用于准备CustomActionData的51类自定义操作的目标为[!filekey],那么当您在自定义操作中检索CustomActionData属性的值时,它将包含完整路径文件,整个路径和文件名。这显然有效,但如果您为许多文件执行此操作则不切实际。