当有一个更新的文件必须用现有文件替换时,如果其中一个文件被任何进程使用,那么弹出一个正在使用的文件对话框。我想避免该对话框并将该文件排队等待安装,以便在系统重启时安装。 我已经读过,在重新启动时将文件排队等待更新是Windows安装程序的内置功能。 有人可以建议我删除FileInUse对话框的方法。 我尝试将“MsiRMFilesInUse”属性设置为“0”,但它不起作用。
答案 0 :(得分:2)
本质上:您可以
1)
完全安静地运行(禁止使用中的文件对话框),2)
关闭锁定 正常地(应用程序更新以允许正常关闭-有或没有重启管理器支持),3)
确保适当的服务控制(如果处理服务),4)
强制杀死 正在运行的进程(“大锤方法”),5)
如果检测到锁定,则中止设置,6)
< / strong> 部署前需要注销,7)
为每个版本安装到新文件夹(并排安装)等...
下面是使用中的文件问题和Restart Manager的详细信息,旨在快速查看使用中的文件和重新启动问题。
关于您的实际问题。我不会惹上FileInUse dialog(s)
。它不会真正解决您的问题。也许考虑一下这些指针:
HKLM\Software\Policies\Microsoft\Windows\Installer
。我想如果检测到锁定文件,您也可以中止安装,或者您可以要求用户注销,如果安装已完成,则为-系统。
请至少略过其余答案,以获取更多详细信息和上下文。
您的应用程序和服务应准备好被Restart Manager关闭,并保存干净重启所需的用户数据和状态信息 。这需要对应用程序/服务进行更新和更改,以符合关闭和重新启动应用程序的标准。
重启管理器 :是一种新的C样式API,可从Windows Vista和Windows Server 2008开始使用。重启管理器由单个DLL ,应用可以加载以访问Restart Manager API。 想法是,重新启动管理器将通过使应用程序/服务遵循一系列准则来自动关闭并重新启动您的应用程序:
the crucial tech-read
)本质上:
The whole idea is basically to prefer restarting applications rather than restarting the OS
。为此:1)
您的应用程序使用命令调用RegisterApplicationRestart()
指定用于最终重启的行-它“注册”重启 管理。2)
您的应用程序监视WM_QUERYENDSESSION
消息并以适当的方式正常关闭数据保存 当被告知要这样做时。3)
然后,Restart Manager可以重新启动 应用程序安装完成后(可以禁用重新启动)。
更多技术资料:
重启管理器配置 :有许多属性会影响重启管理器如何与Windows Installer一起运行:
使用Restart Manager时,将使用MsiRMFilesInUse对话框而不是FileInUse dialog来显示已锁定文件的应用程序列表。
N!B!也可以通过策略禁用整个Restart Manager功能:
HKLM\Software\Policies\Microsoft\Windows\Installer
。如果您没有时间或资源来实现与Restart Manager的适当互操作性(坦率地说,这是Windows开发中目前唯一将资源投入的明智之举),那么可能要知道的事情:
FileInUse
对话框。但是,除非您指定REBOOT=ReallySuppress property
,否则这可能会导致系统重新启动。built-in MSI constructs
至shut down services
-Service Control table。
App.exe -shutdown
。也许系统任务栏应用程序不为用户保存任何数据?WiX
:Kill windows service forcefully in WIX。VBScript
:Close an application using VBScript。Advanced Installer
:How to detect or stop a process。Installshield
:Kill process。 Kill process documentation。REINSTALLMODE="amus"
强制覆盖文件?
repair
和modify
情况。一些其他链接 :
答案 1 :(得分:0)
假设您是软件包的作者,我建议您遵循使用MsiRMFilesInUse对话框的规范。但是,如果您仍然想禁用某些功能,请先了解Using Windows Installer with Restart Manager上软件包作者的指南:
将MsiRMFilesInUse对话框添加到您的包中。如果软件包中包含MsiRMFilesInUse对话框,则将为Windows Vista用户提供在完整UI user interface level上运行安装的选项,以自动关闭并重新启动应用程序。安装包可以同时包含“ MsiRMFilesInUse”对话框和“ FilesInUse”对话框的信息。仅当该软件包至少与Windows Vista上的Windows Installer 4.0一起安装时,才会显示MsiRMFilesInUse对话框,否则将被忽略。没有“ MsiRMFilesInUse”对话框的现有软件包可以使用“ FilesInUse”对话框继续运行。可以使用自定义转换将MsiRMFilesInUse对话框添加到现有程序包。 最终用户通常在完整UI user interface level上运行安装。基本UI或精简UI级别的安装使用户可以选择使用Restart Manager来减少系统重启,即使没有MsiRMFilesInUse对话框也是如此。静默的UI级别安装始终会关闭应用程序和服务,并且在Windows Vista上始终使用重新启动管理器。
:::
软件包作者可以在LaunchCondition table的MsiSystemRebootPending property中建立一个条件,以防止在系统重新启动挂起时安装其软件包。
- 软件包作者和管理员可以使用MSIRESTARTMANAGERCONTROL,MSIDISABLERMRESTART,MSIRMSHUTDOWN属性和DisableAutomaticApplicationShutdown策略来控制Windows Installer和重新启动管理器的交互。
li>
设置MSIRESTARTMANAGERCONTROL=Disable
,可能会从包中删除FilesInUse和MsiRMFilesInUse对话框,并有选择地调整关于System Reboots的其他设置(例如设置{{3} }或REBOOT
属性)。
如果您不是软件包的作者,则可能是在错误的论坛中提问。的
REBOOTPROMPT
策略听起来像它可以完成您所描述的大部分操作,并且适用于计算机上安装的所有软件包。它仅供系统管理员使用,而不是软件包作者。另外,您可以创建转换(或在安装命令行上指定属性)以像软件包作者一样有效地更改软件包。
答案 2 :(得分:0)
希望这里不要重复太多,但我将首先指出该对话框的原因是避免重新启动。您没有说为什么要等待重新启动,而不是使用使您避免在一开始就重新启动的使用中功能。还不清楚何时需要下次重新启动,问题是在所有文件都被完全替换和更新之前,应用程序的安装才完成。未完全安装的应用程序崩溃的情况并不罕见,因为其当前状态是一些旧文件和新文件混合在一起。
没有MsiRMFilesInUse属性,因此设置它无效。
MSIRESTARTMANAGERCONTROL属性告诉Windows是使用旧的FilesInUse行为还是新的重新启动管理器FilesInUse使用中检测方法。它不会关闭使用中文件的行为检测,而只是在新旧方法之间切换。由于检测方法不同,根据实际使用的文件,您可能会看到不同的行为(旧方法只能检测到具有打开窗口的应用程序)。
您应该说出正在使用哪个工具来生成MSI文件,因为它们具有不同的功能。 Visual Studio安装程序实际上不支持自动关闭,除非您使用安装程序类安装服务,然后可以扩展您的Uninstall方法以在卸载时停止该服务。如果您使用的是WiX,则有util :: CloseApplication功能。
受支持的Windows关闭方法是将您的应用程序与Restart Manager集成在一起,Stein具有链接。对于服务,使用MSI ServiceInstall / ServiceControl进行“常规”服务安装可解决此问题,但不适用于具有安装程序类的Visual Studio安装项目。
最后,创建一个MSI详细日志并查找使用中的条目,通常会出现1603错误(使用中的文件,而不是安装崩溃的文件)。如果对话框告诉您需要关闭的应用程序,则可能不需要此日志,因此,请着重于使它们停止更新的方法,因为这是一个更好的解决方案,而不是尝试抑制默认的Windows行为。