2015-12-18 35 views
0

目的是如果在註冊表中找不到該值,那麼我想分配一個默認值,然後將該值顯示爲默認值字段在安裝程序用戶界面中。默認值爲其實我是想用的是[計算機]但顯然我不能在屬性值屬性直接使用[計算機],因爲它會給我錯誤的編譯,具體如下:在失敗的RegistrySearch未運行後設置屬性的自定義操作

警告CNDL1077:在' MYPROPERTY'屬性包含'[ComputerName]' 的值,這是對另一個屬性的非法引用。如果 該值是一個字符串文字,而不是屬性引用,請 忽略此警告。要使用另一個 屬性的值設置屬性,請使用具有屬性和值屬性的CustomAction。

我甚至在嘗試[ComputerName]之前就想用純文本處理它,但到目前爲止我甚至都無法工作。

在我的項目中,我有一個Product.wxs文件,其中包含產品元素,很多自定義操作(其中大部分運行良好,但它們都運行得很快)以及以下不合作的元素,以及是產品元素下的所有兄弟。

屬性定義和註冊表搜索:

<Property Id="MYPROPERTY" Value="ADefaultValue"> 
    <RegistrySearch Id="MyProperty" Type="raw" Root="HKLM" Win64="$(var.Win64)" 
        Key="Software\MyCompany\MyApplication" Name="MyProperty" /> 
</Property> 

自定義動作定義:

<CustomAction Id="SetMyPropertyDefault" Property="MYPROPERTY" Value="MyCustomValue" Execute="immediate"/> 

自定義操作執行:

<InstallExecuteSequence> 
    <Custom Action="SetMyPropertyDefault" After="AppSearch"><![CDATA[MYPROPERTY="ADefaultValue"]]></Custom> 
</InstallExecuteSequence> 

它根本不適合我。

因爲我已經嘗試了自定義元素內容:

<Custom Action="SetMyPropertyDefault" After="AppSearch"><![CDATA[MYPROPERTY="ADefaultValue"]]></Custom> 

<Custom Action="SetMyPropertyDefault" After="AppSearch">1</Custom> // I thought this would always run the custom action. 

<Custom Action="SetMyPropertyDefault" After="AppSearch">NOT MYPROPERTY</Custom> // Back when I wasn't using the default value on the property at all. 

結果總是一樣的,我仍然得到「ADefaultValue」顯示的UI,從來沒有備用「MyCustomValue」起來。

根據每一篇博客和SO貼子,我已經看到我正在做我應該做的事情,除非我清楚我錯過了什麼。
任何想法?


UPDATE /答:

資料片,我是缺少這是由@ sutarmin安東提供的是InstallUISequence運行InstallExecuteSequence(似乎是反直覺給我,但你去之前)。
但是正如它發生的那樣,我不需要在每個安裝序列元素中顯式複製自定義操作調用,而是使用了SetProperty元素。
所以現在我在我的產品中有以下內容。WXS作爲產品元素的子元素:

<Property Id="MYPROPERTY"> 
    <RegistrySearch Id="MyProperty" Type="raw" Root="HKLM" Win64="$(var.Win64)" Key="Software\MyCompany\MyApplication" Name="MyProperty" /> 
</Property> 

<SetProperty Id="MYPROPERTY" After="AppSearch" Value="[ComputerName]">NOT MYPROPERTY</SetProperty> 

現在運行AppSearch兩個InstallUISequence和InstallExecuteSequence後SetProperty,但它運行的不myProperty的第二次會出來false,所以它不會復位,當然,如果它運行在安靜模式下,它仍然可以正常工作。

回答

1

當你經歷的安裝界面,安裝在InstallUISequence。 InstallExecuteSequence在所有UI事件之後運行。這是你沒有看到「MyCustomValue」的原因。要在UI序列之前更改屬性,您應該將自定義操作置於「InstallUISequence」中。

順便說一句,你爲什麼不設置你的屬性設置爲「MyCustomValue」的默認值?然後,如果AppSearch不會在註冊表中找到值,則只會保留您嘗試手動設置的默認值。

+0

謝謝@ sutarmin-anton。將它移動到InstallUISequence上工作正常,但我對該部分的理解是,如果安裝程序在安靜模式下運行,它將無法運行。安靜模式,所以雖然這確實使自定義動作運行,但不幸的是,它並不包含我需要的場景。 – Nanhydrin

+0

@Nanhydrin,我剛剛告訴你可以做什麼來查看UI中更改的屬性。對於您的場景,您可以在InstallUISeq和InstallExecSeq中重複自定義操作,也可以將屬性的默認值設置爲「MyCustomValue」。第二種情況你可能根本不使用自定義操作。 –

+0

我只是使用MyCustomValue作爲一個簡單的測試用例。我真正想要作爲默認值使用的是[計算機]參數,但它似乎沒有可以直接使用,由於樓市默認值,我顯然必須使用自定義操作,以便能夠設置該屬性的默認值。但是我明白你對這個命令的意思,我沒有意識到首先運行的用戶界面,所以我需要按照你的說法把我的自定義操作放在兩個地方。 – Nanhydrin

1

你可能過於複雜的事情。如果您未設置默認值,則MYPROPERTY值將不會被設置。所以然後你打電話給你的CA來設置它,如果'NOT MYPROPERTY'

我看到你已經試過這個,我會說這是我試圖診斷而不是嘗試別的東西的正確方法。詳細的日誌將是非常寶貴的。做一個:

MSIEXEC/I [路徑微星]/L * VX [路徑到一個文本日誌文件]

,看看CA被調用時,AppSearch做什麼的,屬性值等

。您的原始的「我不能使用[計算機]評論 - 如果這就是爲什麼沒有告訴我們發生了什麼,也許有不需要這一切的解決方案有什麼問題的編譯錯誤,例如

+0

謝謝@phildw,我用原始編譯錯誤更新了我的問題,但這就是告訴我首先使用自定義操作的原因。我已經登錄了,我只記得我的自定義操作沒有運行,但我不明白爲什麼,但現在我明白,這是因爲自定義操作在運行時的順序錯誤。 – Nanhydrin

相關問題