首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用MSI转换更改从DLL加载的MSI属性的值。

使用MSI转换更改从DLL加载的MSI属性的值。
EN

Stack Overflow用户
提问于 2019-02-19 07:49:55
回答 3查看 941关注 0票数 1

我需要修改用于"IBM for Windows“的MSI安装程序的安装行为。安装程序是使用InstallShield创建的。在安装过程中,安装程序通过“链接”触发另外两个MSI安装。传递给MSIEXEC.EXE以执行这两个安装的参数由安装中包含的DLL中的自定义操作加载。这些参数以MSI属性结束。

在启动链接安装之前,我希望更改该属性中的值,以操作命令行。这个是可能的吗?如果是这样的话,是怎么做的?创建读取和修改属性的外部DLL没有问题,但我不知道如何将其与现有安装集成--我必须修改哪些表以及如何将DLL放在哪里,

编辑1:为了澄清这一点:我想修改传递给链式安装的参数。它们独立于我传递给主安装的参数,并从安装的一部分DLL加载。

编辑2:我已经上传了普通的MSI +相关的日志文件。我以"/qn“开始主安装,以抑制所有消息。这是没有问题的,链式安装在没有可见提示的情况下被执行。卸载软件(同样使用"/qn")时会出现问题。远程自定义操作从DLL加载(第6417行):

代码语言:javascript
运行
复制
MSI (s) (10:28) [09:00:45:643]: Invoking remote custom action. DLL: C:\Windows\Installer\MSIA4BD.tmp, Entrypoint: ISChainPackages

从DLL加载的命令行指定使用参数"/qb“而不是"/qn”调用/qn(第6958行):

代码语言:javascript
运行
复制
MSI (s) (10!60) [09:00:46:033]: PROPERTY CHANGE: Adding IS_CHAINER_POST_COMMANDLINE property. Its value is '/l"c:\temp\IBM_iAccess_7.1_Uninstall.log" /qb /x{CCA40632-843E-48C6-B14F-E1070015D87C} ...

而且,由于MSI安装程序对文件具有锁,因此在卸载链接的MSI时会弹出消息框(第44046行):

代码语言:javascript
运行
复制
MSI (s) (10:C0) [09:01:05:553]: RESTART MANAGER: Did detect that the custom action server with process ID 2352 holds file[s] in use, so a reboot will be necessary.
MSI (s) (10:C0) [09:01:05:553]: Note: 1: 1610 
MSI (s) (10:C0) [09:01:11:224]: RESTART MANAGER: The user chose to go on with the installation, although a reboot will be required.
The setup must update files or services that cannot be updated while the system is running. If you choose to continue, a reboot will be required to complete the setup.

此软件的7.1版本的安装文件在IBM网站上不再可用。只有目前的版本是,而且我还没有调查最新版本是否仍然存在问题,因为业务部门要求我打包v7.1。

EN

Stack Overflow用户

回答已采纳

发布于 2019-02-27 16:26:26

解决此问题的一种方法是创建一个新的自定义操作,它执行存储在VBScript表中的Binary代码,并将新的自定义操作放在ISChainPackagePrepare之后。VBScript代码将读取IS_CHAINER_POST_COMMANDLINE的值并替换Replace()函数中指定的值。

VBScript代码可能如下所示:

代码语言:javascript
运行
复制
Option Explicit

Function ReplacePropVal()
    dim propvalue
    dim newvalue
    propvalue = Session.Property("IS_CHAINER_POST_COMMANDLINE")
    newvalue = Replace(propvalue,"/qb","/qn")
    Session.Property("IS_CHAINER_POST_COMMANDLINE") = newvalue
End Function

您希望给新的自定义操作一个6种类型,以指示自定义操作数据作为VBScript存储在Binary表中。自定义操作Source是对Binary表中的Name的引用。自定义操作的Target值需要是VBScript函数的名称,在本例中是ReplacePropVal

之后,使用与InstallExecutionSequence表相同的名称将新的自定义操作放置在CustomAction表中。还要确保给它一个更高的Sequence值作为ISChainPackagePrepare。我建议将SequenceISChainPackagePrepare值增加1,将其放在紧接其后的位置。

更改表并生成新转换之后,只需运行包,并通过在TRANSFORMS公共属性中指定其路径来应用新的转换,您的属性值就应该被更改。

票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54761131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档