WiX - 在“添加/删除程序”中动态更改已安装产品的名称

时间:2017-11-09 04:52:15

标签: wix installer

我正在使用WiX安装程序,该安装程序使用对话框中的文本框从用户输入“名称”输入。此名称将用于命名我正在安装的产品。

但是,我无法在安装过程中动态设置产品名称。即使我使用自定义操作,也会使用我之前提供的静态名称创建注册表项。这最终会导致不一致。

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

这不能在自定义操作中完成。确实,您可以在安装的早期设置自定义操作(例如类型51)中的ProductName属性,这确实会更改UI中的名称,但它不会更改已安装产品的名称 - 它将保留与原始值相同。例如,枚举已安装的产品将返回原始名称。

因此,唯一可行的方法是在启动MSI文件之前修改它。您将有一个启动程序,修改MSI文件,然后安装它。 MSI文件是可以在Property表中修改的数据库,用于更改ProductName的值。这个例子将给你一般的想法:

How do I add/update a property inside an MSI from the command-line?

但基本上你打开数据库(MsiOpenDatabase或等效的)然后使用SQL打开MsiOpenView,如:

“UPDATE属性SET Property.Value ='您的变量'WHERE Property.Property ='CurrentProductName'”

然后MsiViewExecute和关闭句柄等。详细信息取决于您首选的编码语言环境。

这不是一个理想的解决方案,因为如果你的MSI文件是经过数字签名的,那么你已经篡改它并且它不再正确。

另一种方法是基于更改MSI文件的副本来生成转换文件。如果您复制了MSI文件,然后如上所述更改ProductName,则可以执行MsiDatabaseGenerateTransform()调用,该调用将生成转换文件,.mst文件,两个MSI文件之间的差异。然后使用包含TRANSFORMS = [.mst文件]的命令行安装原始未更改的MSI文件,该命令行将更新ProductName并开始安装。

这一切都不容易,因为Windows Installer产品并非设计为具有动态产品名称。也许在历史上和Windows Installer设置之前,这更加实用,但在MSI设置中则不然。