2014-02-28 68 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完成它之後才發生廣播而進行無意義的更改。

相關問題