【问题标题】:MSI: Reading properties from Custom Action in Merge Module (MSM)MSI:从合并模块 (MSM) 中的自定义操作中读取属性
【发布时间】:2011-11-02 02:48:05
【问题描述】:

我在尝试构建 MSM 时遇到了这个问题。显然,模块属性(以及与此相关的所有标识符)在模块生成期间通过在其名称末尾添加模块 GUID 来重命名。例如,属性“MY_PROPERTY”重命名为“MY_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72”(假设 803A3089-928F-46F1-BBAE-CBD39A7D6A72 是模块 GUID)。我相信这是用于防止多个模块在尝试使用同名标识符时发生冲突的机制。

我需要从 MSM 中调用一个 DLL 自定义操作,该操作需要为特定属性设置一些值(我们称之为“THE_PROPERTY”)。问题是 THE_PROPERTY 如上所述被重命名为 THE_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72,因此自定义操作永远找不到该属性并失败。

有什么办法可以解决这个问题吗?我正在考虑修改自定义操作,以便它尝试(以某种方式)找出调用它的模块的 GUID。一种方法是查看当前操作名称,该名称还应包括 GUID。但是我可以从自定义操作中获取当前操作名称吗?你能想出另一种解决方案吗?

谢谢!

【问题讨论】:

    标签: dll module windows-installer custom-action merge-module


    【解决方案1】:

    确实,合并模块内的属性是通过在属性名称后使用模块 GUID 来访问的。

    一个好的解决方案是让自定义操作访问 THE_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72 而不是 THE_PROPERTY。

    另一种解决方案是使用type 51 custom action

    • 在 MSI 中使用格式化的自定义操作(类型 51)创建属性集
    • 将其配置为将 THE_PROPERTY 设置为:

      [THE_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72]

    • 将其安排在读取 THE_PROPERTY 的自定义操作之前

    这样,合并模块属性将保存到一个 MSI 属性中,该属性具有您的自定义操作所使用的名称。

    Type 51 自定义操作为每个设置创作工具添加了不同的方式。如果您需要确切的说明,请提及您正在使用的设置工具。 Visual Studio 不支持这个。

    【讨论】:

    • 感谢您的回答。解决方案 #1 对我不利,因为此自定义操作 DLL 是通用的,因此我无法在其中硬编码 GUID。这就是为什么我想知道是否可以从自定义操作中获取此 GUID(例如,通过读取操作名称然后从中提取 GUID)。解决方案#2 也不好,因为我必须在 MSI 中包含来自 MSM 的逻辑。我的意思是,如果我必须在 MSI 中包含 MSM 的一些逻辑,那么 MSM 有什么用?顺便说一句,我在 Visual Studio 上使用的是 WiX 3.0。
    • 那你就卡住了。要么找到将 GUID 传递给自定义操作的方法,要么找到设置 MSI 属性的方法。没有其他解决方案。此外,MSM GUID 与您的自定义操作没有任何关系,因此您无法从某处提取它。你可以试试,但不可靠。此 GUID 通常是硬编码的,例如作为自定义操作参数。
    • 自定义操作是否可以看到正在调用它的操作的名称?再次感谢。
    • 并非如此。您可以做的最好的事情是使用接收安装句柄的自定义操作并尝试从 MSI 数据库中获取模块 GUID 或操作名称。
    • 是的,我可以访问数据库并查询模块 GUID。问题是可以有多个模块,因此有多个 GUID,我将无法判断哪个模块在调用 CA。你能想出一种获取当前动作名称的方法吗?我可以读取 SEQUENCE 属性来确定正在运行的序列表,但我如何知道它们的哪些操作正在执行?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多