在InstallFile之后和CreateShortcuts之前运行CA.

时间:2014-06-16 10:54:20

标签: windows-installer installshield custom-action

我有InstallShield 2013 Basic MSI项目 我希望有一个CA将在安装文件后运行但在创建快捷方式之前,我该怎么做? 我尝试创建将在InstallFile之后运行的CA,但在运行安装程序时,我看到当它到达InstallInitialize时,它会跳过所有CA除了我添加的那个并运行它之后再返回InstallInitialize并运行所有自定义操作跳过。

2 个答案:

答案 0 :(得分:2)

您在日志中看到的是Deferred Execution操作在InstallExecuteSequence中的影响。 InstallExecuteInstallFinalize之间的每个延迟操作都会在遇到时写入脚本。然后,作为InstallFinalize的一部分,执行脚本中的所有操作。 (除非有失败,否则会涉及回滚操作,并跳过剩余的延迟操作。)

大多数内置操作都有延迟组件,或者完全延迟。对机器的任何更改都应在延迟操作中完成。请注意,延迟操作具有limitations,特别是它们可以读取的属性(通过MsiGetProperty或等效物)。

这让我们回到了您的自定义操作尝试执行的操作的问题。根据您的要求,直接答案是您需要将其标记为延期。这样做可能需要您更改其实现。但更重要的是,您应该考虑是否有内置的Windows Installer方法来完成您想要完成的任务,或者内置于您正在使用的工具(在本例中为InstallShield)的方法。如果是这样,你应该更喜欢使用这些内置替代品而不是编写自己的替代品,因为编写一个不能处理它应该处理的每个场景的自定义操作非常容易。

答案 1 :(得分:1)

Michael Urman 提供了一个很好的答案,但让我尝试不同的词,因为这是一个难以理解的话题。一些角度可能是好的。我们还需要回答您实际需要做什么 - 通常内置的MSI功能优于自定义操作。真的; - )。

事实上,答案是您需要 CreateShortcuts 之前安排的延迟模式自定义操作,以及 InstallFiles 之后<强> InstallExecuteSequence 即可。在此位置,文件将在磁盘上可用,并且尚未创建快捷方式。但是,为了清楚起见,必须正确理解几件事情。

enter image description here

  • 对于每种安装类型(安装,卸载,修改,修补),InstallExecuteSequence表中的操作迭代两次
  • 首次运行是立即模式。仅当将其设置为立即模式时,才会检查并运行所有操作。立即模式操作应检查系统,收集信息,设置属性值,而不是更改系统上的任何内容。它们以用户权限运行。所有其他操作都写入执行脚本,以延迟模式运行。
  • 第二次运行是延迟模式。现在执行第一次运行组装的更改脚本。无法读取表,只能以交互方式访问少数属性。所需的所有其他属性必须写入执行脚本并在执行脚本中可用。这些操作可以使用 LocalSystem 运行,并且可以更改系统上的任何内容,或者根据需要使用用户权限运行。
  • 需要将属性写入延迟执行脚本并通过 CustomActionData属性概念将其读回来,这使事情变得非常复杂。整个概念最好用separate article on the topic
  • 描述
  • 以下是我在其他网站上撰写的较旧答案:forum.installsite.net/17211
  • 并在此处阅读:http://helpnet.installshield.com/installshield16helplib/AccessingProps-DeferredCAs.htm