Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wix MSI:InstallValidate期间卸载时如何停止服务-这是否仍然有效?_Wix_Windows Installer_Uninstallation - Fatal编程技术网

Wix MSI:InstallValidate期间卸载时如何停止服务-这是否仍然有效?

Wix MSI:InstallValidate期间卸载时如何停止服务-这是否仍然有效?,wix,windows-installer,uninstallation,Wix,Windows Installer,Uninstallation,我想知道,如果在WiX项目文件中某个服务被标记为Remove=“uninstall”stop=“uninstall”,该服务将如何以及何时尝试停止 为什么我要问: 卸载时,重新启动管理器无法正确识别或处理该服务,导致出现“重新启动对话框” 我将调试器连接到该服务,并意识到从未尝试过停止它-至少,没有通过注册的ControlHandler停止。我猜测,它将以与执行“sc stop servicename”相同的方式停止,或者通过服务对话框停止。服务本身是用C++编写的,而控制处理程序则通过 Rea

我想知道,如果在WiX项目文件中某个服务被标记为
Remove=“uninstall”stop=“uninstall”
,该服务将如何以及何时尝试停止

为什么我要问: 卸载时,重新启动管理器无法正确识别或处理该服务,导致出现“重新启动对话框”

我将调试器连接到该服务,并意识到从未尝试过停止它-至少,没有通过注册的ControlHandler停止。我猜测,它将以与执行“sc stop servicename”相同的方式停止,或者通过服务对话框停止。服务本身是用C++编写的,而控制处理程序则通过<代码> RealService SercTrLHANDLUT/<代码>进行注册。在停止服务时调用处理程序。如果通过MSI停止/卸载,则情况并非如此

顺便问一下,正如jbudreau在中的回答所述,如果服务作为LocalSystem运行,是否可以在InstallValidate部分停止服务?在InstallValidate中,卸载过程尚未提升

如果能解释一下停止本地系统服务的过程是如何进行卸载的,那就太棒了

提前谢谢

编辑: 以下是我的ServiceInstall和ServiceControl服务定义:

        <DirectoryRef Id="BINDIR">
        <!-- the service -->
        <Component Id="myProgramsvc.exe" Guid="1f64c03f-26ea-47ba-985c-2a566afffffa">
            <File Id="myProgramsvc.exe" KeyPath="yes" Vital="yes"
                  Source="SourceDir\bin\myProgramsvc.exe"/>
            <ServiceInstall Id="MyProgramSvc" Type="ownProcess"
                            Vital="yes" Name="MyProgramSvc" DisplayName="Test MyProgram Service"
                            Description="Test MyProgram Service" Start="auto" Account=".\LocalSystem"
                            ErrorControl="normal" Interactive="no" Arguments="--run"/>
            <ServiceControl Id="MyProgramSvc" Name="MyProgramSvc" Wait="yes" Remove="uninstall" Stop="uninstall" Start="install"/>
        </Component>
    </DirectoryRef>
编辑3:
日志文件:-日志文件太大,无法在此发布(限制30000个字符)

InstallValidate不停止服务-这由StopServices操作完成。InstallValidate尝试找出正在使用的文件(使用重新启动管理器)并显示“正在使用的文件”对话框。就服务而言,它会忽略ServiceControl表中具有“卸载时停止”设置的服务正在使用的任何文件。如果要确保服务完全停止,请使用wait=“yes”。这是一个标准的停止服务控制处理程序调用

如果该服务触发了一系列仍在运行的进程,那么这只是一个普通的文件使用问题,服务与此无关。这些进程需要一个关闭调用(来自服务?),或者它们应该与Restart Manager集成,这类事情:

如果进程响应windows消息,WiX util CLOSE应用程序应将其关闭


我将指出,您可能只是在您的WiX中有一个bug,其中ServiceControl中命名的服务不正确。由于您可以控制任何服务(不仅仅是您正在安装/卸载的服务),因此不需要检查名称是否与您的服务或任何其他服务对应。如果您从未看到服务控制停止被调用,这是最简单的解释

请参见编辑。ServiceControl元素包含正确的名称。可能值得卸载并创建详细日志,以查看它对StopServices的说明。msiexec/x{product guid}/l*vx已经这样做了-请参阅编辑。我将日志输出添加到问题中。问题不在于停止服务。停止应用程序并终止所有进程(在几秒钟内)。无论如何,它是在InstallValidate之后安排的。InstallExecuteSequence包含带1400的InstallValidate和带1900的StopServices。重启管理器正在抱怨--as.exe。服务的所有子进程是否都必须包含一些特殊的内容,以便重启管理器知道,如果服务停止,它将被服务终止?您一定错过了我的评论,我说过InstallValidate不会为StopServices标记为稍后停止的服务引发文件使用中事件,所以“之后”这无关紧要。InstallValidate不会停止服务,正如您的帖子主题所说,InstallValidate会在启动安装事务之前检查文件是否处于使用状态。整个日志可能有用;此外,您的帖子在日志片段中显示PID 9324,但在流程显示中显示PID 2324;那--as.exe是您的服务可执行文件还是其他东西?无法从日志、显示和您的服务名称中分辨出确切的详细信息;此外,OP说MSI卸载没有调用SCH,但您的评论说..“StopServices停止应用程序并终止所有进程”,这似乎是相互矛盾的说法。我试图解释InstallValidate/StopServices是如何工作的,但在没有清楚细节的情况下,我没有给出具体说明。
MSI (s) (BC:38) [16:46:14:141]: RESTART MANAGER: Detected that application with id 9324, friendly name '---as.exe', of type RmCritical and status 1 holds file[s] in use.
MSI (s) (BC:38) [16:46:14:141]: RESTART MANAGER: Did detect that a critical application holds file[s] in use, so a reboot will be necessary.