【问题标题】:Get target file path from custom action从自定义操作中获取目标文件路径
【发布时间】:2015-12-17 00:08:43
【问题描述】:

如何通过WiX 自定义操作获取正在安装的文件的路径?

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

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

扩展有它的自定义表,它有一个指向“组件”和“文件”表的外键列,并且在安装/卸载文件的组件时执行(如内置的 IIS 扩展或 SQL 扩展例如)

我想要实现的是,在我的延迟(计划)自定义操作中,找出扩展名绑定到的文件的目标路径。 IE。基本上在不同的自定义操作中,我想获得 [!filekey] 的值(就 MSI formatted 字符串而言)。我该怎么办?

我发现了一个有点相似的话题here

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

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

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

这里WcaGetFormattedString 基本上是MsiFormatRecord 的包装器

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

【问题讨论】:

    标签: wix windows-installer custom-action


    【解决方案1】:

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

    How to pass CustomActionData to a CustomAction using WiX?

    明确地说,如果用于准备 CustomActionData 的类型 51 自定义操作的目标为 [!filekey],那么当您在自定义操作中检索 CustomActionData 属性的值时,它将包含文件,整个路径和文件名。这显然是可行的,但如果您对许多文件执行此操作将不切实际。

    【讨论】:

    • 我的意思是,我需要将其扩展为目标系统上的真实文件路径。也就是说,给定一个文件 ID(filekey),我需要知道这个文件将安装在哪里(物理文件路径)。或者你们这些格式化的字符串会在 Customactiondata 中自动扩展?
    • 澄清一下 - 问题不是如何将字符串从直接 CA 或用户界面传递到延迟 CA... 我的意思是:给定一个文件 ID(文件密钥)我需要知道这个文件将/已安装..即文件所属组件的目录路径。我需要从自定义操作中获取此信息。我希望这可以澄清问题...我的意思是,用户可以选择功能的目标路径,对,并且这些功能中的组件安装到这些路径。给定文件密钥,我如何找到它们?
    • 我不知道是我解释得不对还是你不明白,所以我添加了一个我刚刚测试过的明确示例,它可以工作。
    • 可能我的问题有点不清楚......无论如何,现在我在查看 WIX 游戏和 NetFX 扩展源代码后很高兴。它似乎已经解决了这个问题。感谢您的时间。这是帮助的代码片段的链接:github.com/wixtoolset/wix3/blob/develop/src/ext/GamingExtension/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    相关资源
    最近更新 更多