2013-06-21 120 views
17

example here之後,我添加了啓動我的應用程序的ProgramMenuFolder的快捷方式。 (我的代碼實際上是簡單,因爲我並不需要額外的文件夾。)(WiX)每臺機器安裝的程序文件快捷方式

<DirectoryRef Id='ProgramMenuFolder'> 
    <Component Id='cmpStartMenuShortcut' 
      Guid='MY GUID HERE'> 
    <Shortcut Id='StartMenuShortcut' 
       Name='$(var.ProductName)' 
       Icon='MainIcon.ico' 
       Description='$(var.ProductName)' 
       Target='[ClientDir]myapp.exe' 
       WorkingDirectory='ClientDir'/> 
    <RegistryValue Action='write' Type='integer' Root='HKCU' 
        Key='Software\Company\Product Name' 
        Name='installed' Value='1' KeyPath='yes'/> 
    </Component> 
</DirectoryRef> 

由於我的安裝是每臺機器,封裝/ @ InstallPrivileges = '升高',並@ InstallScope ='(ALLUSERS = 1 perMachine ')ProgramMenuFolder是機器上所有用戶的文件夾。

我的問題與註冊表值有關。我的理解是隻需簡單地爲包含快捷方式的組件提供KeyPath即可。該示例使用HKCU,這是一個每個用戶的位置。

將每個用戶的值用作每個機器組件的KeyPath不是一個錯誤嗎?

如果一臺機器有兩個管理員,並且管理員#1安裝產品並且管理員#2嘗試修復,則Windows安裝程序將不會看到註冊表值,並且認爲該快捷方式丟失,並且會安裝一個重複,對嗎?

所以我試圖改變RegistryValue/@根到HKLM,但隨後維克斯抱怨:

錯誤LGHT0204:ICE38:組件cmpStartMenuShortcut安裝到用戶的個人資料。它[原文如此] KeyPath註冊表項必須屬於HKCU。

錯誤LGHT0204:ICE43:組件cmpStartMenuShortcut具有未公佈的快捷方式。這是[原文如此] KeyPath註冊表項應歸入HKCU。

錯誤LGHT0204:ICE57:組件'cmpStartMenuShortcut'具有每臺機器KeyPath的每個用戶和每臺機器的數據。

我不明白爲什麼鑰匙必須在HKCU下。

回答

11

這種快捷方式適用於目前可能尚未安裝的目標,也不是在調用它時。它創建了經典的.lnk快捷方式文件。對於您的安裝程序不負責的目標的快捷方式很有用,但可能對您的產品用戶有用(例如cmd.exe)。

或者,當目標未被廣泛使用(產品被卸載)時,正在安裝或宣傳的目標的快捷方式將被卸載。例如,WiX安裝稱爲WiX文檔的wix.chm快捷方式。廣告快捷方式的快捷方式元素可以作爲File元素的子元素。

這裏是一個手寫例如:

<Component Id="ProductComponent"> 
    <File Source="$(var.ConsoleApplication1.TargetPath)" KeyPath="yes"> 
    <Shortcut Id="$(var.ConsoleApplication1.TargetName)Shortcut" 
       Name="$(var.ConsoleApplication1.TargetName)" 
       Advertise="yes" 
       Description="Starts $(var.ConsoleApplication1.TargetName)" 
       Directory="ProgramMenuFolder" /> 
    </File> 
</Component> 

要插入快捷元件成熱量的輸出,路徑將它傳遞給XSL轉換。代碼段:

<xsl:template match="wix:File[contains(@Source,'\myapp.exe')]"> 
    <xsl:copy-of select="." /> 
    <Shortcut Id='StartMenuShortcut' 
      Advertise="yes" 
      Name='$(var.ProductName)' 
      Icon='MainIcon.ico' 
      Description='$(var.ProductName)' 
      WorkingDirectory='ClientDir'/> 
</xsl:template> 
+2

謝謝。這個解決方案似乎爲我工作。我不知道當我開始WiX道路時,我將不得不瞭解XSLT。 –

+1

你還沒有真正回答過,爲什麼一個非廣告的快捷方式不能將其'KeyPath'寫入HKLM,或者爲什麼非廣告的快捷方式需要**註冊表** KeyPath',但廣告的快捷方式不需要。 –

0

我推薦做的事情就是簡單地按照你說的做文件夾,但不要直接在它下面放置快捷方式。而是在保存該文件的組件下創建一個快捷方式元素。您可以使用「目錄」屬性指定您希望顯示快捷方式的位置。

+0

感謝您的建議。不幸的是,保存文件的組件是通過加熱(並定期重新生成)生成的,因此使用該方法是不現實的。我真的很想理解_why_將每個機器位置用作每個機器組件的KeyPath是錯誤的。 –

+1

這裏的主要問題是整個開始菜單是每個用戶。您所引用的用戶是整個用戶組,但Windows Installer認爲這是用戶本身。 – Adkins

+0

開始菜單不是每個用戶和每臺機器元素的混合視圖嗎?當我運行我的安裝程序每臺計算機時,該快捷方式將添加到所有用戶\開始菜單\程序而不是 \開始菜單\程序。 –

相關問題