MSI:从合并模块(MSM)中的自定义操作读取属性

时间:2011-11-01 17:51:59

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

我在尝试构建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。但是我可以从自定义操作中获取当前操作名称吗?你能想到另一个解决方案吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

实际上,可以使用属性名称后面的模块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属性中,该属性具有自定义操作使用的名称。

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