2014-02-28 70 views
0

可能这不是一个严格的WIX问题,但它应该是一个众所周知的问题,与设置完善的最佳实践有关。我在Google上找不到这些做法。使用WiX 3.6,Windows 7,Visual Studio 2008,但安装必须支持Windows从XP到更新。必须在更改PATH后重新启动

我正在安装依赖于某些第三方DLL的COM对象。对象本身已经注册好了,并且所有DLL都安装在安装文件夹中,安装程序将此文件夹添加到系统的环境变量PATH。代码如下所示:

<Component Id="RequiredLibraries" Guid="$(var.RequiredLibrariesGUID)"> 
    <?include redist.wxi?> 
    <Environment Id="PATH" Name="PATH" Value="[INSTALLDIR]" Permanent="no" Part="last" Action="set" System="yes" /> 
</Component> 

在我的机器,我可以在安装后立即使用对象,但在某些机器上,我必须重新启动计算机。这次重启很痛苦,我不知道为什么它是必要的,为什么只在某些机器上。我可以<ScheduleReboot After="InstallFinalize"/>,但我希望有更好的解决方案。因此,请随时回答以下任何问题:

  1. 此问题的最佳常见做法是什么?我无法将所有东西都打包到一个DLL中,所以我需要一个针对多个DLL的解决方案。

  2. 我能做些什么来启用COM对象的使用(通过使更改为PATH对系统的其他部分可见),而不诉诸重新启动,或用户重新登录或重新启动资源管理器? Windows安装程序是否广播WM_SETTINGCHANGE消息?我应该在自定义操作中播放它吗?

  3. 我该如何检测并要求用户只有在需要时才重新启动/重新登录,而不是总是如此? (某些机器不需要重新启动)

  4. 我该如何安排比重新启动更轻松的工作?

+0

流程会在开始时读取环境。你必须重新启动过程。这不需要重新启动,而是需要注销/登录周期。但是有些东西就像一个窗口消息,你可以发送给所有进程,其他进程*可以*处理这个消息。 http://stackoverflow.com/questions/11167854/sending-wm-settingchange-message-to-refresh-desktop-autoit-possibly – harper

+0

承载COM对象的过程是什么?它在什么情况下运行? –

+0

@ChristopherPainter不知道如何了解上下文,但我相信客户端进程正在托管对象(因此我推断Explorer对环境变化是无视的)。线程模型是公寓。接口类从'CComObjectRootEx '派生。 – Dialecticus

回答

1

有两种情况我知道的:

1)申请不兑现WM_SETTINGCHANGE广播(通常是由什么服务控制管理器承载)

2)在微星的行为,当它选择不发送广播。每WriteEnvironmentStrings Action

(强调)

的WriteEnvironmentStrings动作或RemoveEnvironmentStrings 行动的运行时环境变量不能用于正在进行 安装改变。在Windows 2000,Windows Server 2003,Windows XP和 Windows Vista中,此信息存储在注册表中,并且在安装完成时发送WM_SETTINGCHANGE消息以通知系统更改 。另一个进程可以通过处理这些消息来接收 更改通知。 如果系统重新启动未决,则不会发送消息 。程序包可以使用MsiSystemRebootPending属性检查系统重新启动是否为 挂起。

我已经通过编写一个。NET自定义操作(使用环境类),只是为了让MSI完成它之后才发生广播而进行无意义的更改。

相关问题