2012-05-28 145 views
4

之前重启。如果我启动安装程序与MSIEXEC在安静模式下,我可以检测是否需要重新启动通过检查来完成安装,如果退出代码是3010,但希望我能够以可编程形式执行测试是否安装MSI需要重新启动才能完成之前我启动实际安装程序。检测是否需要MSI安装

我在微星的API环顾四周:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa369426(v=vs.85).aspx

我没想到我能:

  1. 呼叫MsiOpenPackage让安装程序就可以运行
  2. 呼叫MsiDoAction与以下内容:CostInitialize,FileCost,CostFinalize,InstallValidate
  3. 从FilesInUse表中读取记录(下表在MSDN上翼文档表明,这台正在运行CostFinalize/InstallValidate之后创建的:

http://msdn.microsoft.com/en-us/library/aa369546(VS.85).aspx

但该表实际上并没有出现,当我在安装过程中查询其存在。是否有其他方法来检查是否需要重新启动?

回答

2

决定最终只会在安装过程中自行完成。正如你所知道的,它依赖于DLLs被同时运行的应用程序锁定的情况,因此它非常不稳定。

有没有办法将你保证,你将不会收到退出代码3010的实际安装完成后。

这就是说,退出代码不紧密绑定到正在使用的文件。它也可能表明无法停止某项服务或者其他暂时或永久的状况。在尝试之前,您无法了解是否可以停止服务。

+0

这很有道理 - 用户可以在安装启动并导致问题后启动应用程序。 –

1

尔卡是对有关的波动是需要重新启动 - 各种事情可能在安装过​​程中发生的。

不过,我想我得靠近想什么,我能够用不同的方法去做:

  1. 注册外部用户界面处理程序INSTALLLOGMODE_RMFILESINUSE
  2. 捕捉INSTALLMESSAGE_RMFILESINUSE消息
  3. 如果我捕捉任何INSTALLMESSAGE_RMFILESINUSE的消息,返回-1,并退出安装任何文件拷贝进行

之前,这样我可以尝试SI借给软件后台安装,但如果由于任何原因,它看起来像我将无法完成安装,我可以阻止。我想我可以使用MsiBeginTransaction和MsiEndTransaction函数进行回滚,如果我最终处于用户开始复制后锁定文件的状态。

4

加雷,理论上你不需要执行实际的安装,你应该只执行的动作,直到InstallValidate(含税),因为那时出现在文件正在使用的消息。但是,当使用外部UI处理程序执行安装时,Windows安装程序可能会有一些不同,因此应该进行测试。

+0

我想我已经尝试了一系列CostInitialize,FileCost,CostFinalize,InstallValidate - 但我不认为我得到了所需的回调。我可能需要通过InstallExecuteSequence表并确保eveything正在正确设置。 –