如何将Package Builder获取的值传递至MSI安装包?
从UI传递文本控件值到MSI的正确方法
核心逻辑:MSI靠**公共属性(Public Property)**在UI和安装引擎间传递自定义值,直接写注册表无效是因为没走MSI的内置机制,下面是具体实现步骤:
绑定文本控件到MSI公共属性
不管你用的是WiX、InstallShield还是其他包构建器,先给文本控件关联一个全大写命名的自定义属性(比如USER_INPUT_VALUE)。MSI仅识别大写属性为公共属性,才能跨UI和安装序列传递值。
举例:如果是WiX,在UI的<Control>节点里指定Property="USER_INPUT_VALUE";如果是InstallShield,在控件属性面板里设置"Property Name"为这个大写属性名。用MSI内置机制使用属性值
不要在UI阶段直接操作注册表,要通过MSI的内置表来实现:- 写入注册表:在MSI的注册表表(Registry Table)中,把注册表值的内容设为
[USER_INPUT_VALUE],安装时MSI会自动将属性值代入写入系统注册表。 - 自定义动作调用:如果需要在自定义脚本/程序里用这个值,直接读取该公共属性即可——比如VBScript用
Session.Property("USER_INPUT_VALUE"),C++用MsiGetProperty函数。
- 写入注册表:在MSI的注册表表(Registry Table)中,把注册表值的内容设为
为什么直接写注册表没用?
你之前的操作相当于绕过MSI引擎直接修改系统,这些修改不会被MSI的安装跟踪机制记录,要么会被安装回滚操作覆盖,要么不会被纳入MSI的安装数据库,导致最终效果不符合预期。
具体工具示例
WiX代码片段
<!-- 定义公共属性,初始值为空 --> <Property Id="USER_INPUT_VALUE" Value="" /> <!-- UI中的文本输入控件绑定属性 --> <Control Id="UserInputTxt" Type="Edit" X="30" Y="80" Width="250" Height="18" Property="USER_INPUT_VALUE" Text="[USER_INPUT_VALUE]" /> <!-- 注册表项引用属性值 --> <RegistryKey Root="HKCU" Key="Software\MyApplication\Settings"> <RegistryValue Name="UserCustomText" Value="[USER_INPUT_VALUE]" Type="string" KeyPath="yes" /> </RegistryKey>
InstallShield操作步骤
- 进入「User Interface」视图,找到需要添加文本输入的对话框,插入「Edit」控件;
- 选中控件,在右侧属性面板设置「Property Name」为
USER_INPUT_VALUE; - 进入「Registry」视图,新建目标注册表项,在「Value Data」下拉选择「Property」,再选中
USER_INPUT_VALUE。
内容的提问来源于stack exchange,提问作者BellisimoMeg
相关产品推荐
相关产品推荐

