2013-01-21 57 views
4

我已經使用WiX創建了一個安裝程序,並且在修復安裝我的產品期間試圖保留現有的DWORD註冊表項。爲了存儲現有的值,我使用了下面的WiX片段;使用WiX的RegistrySearch從註冊表中讀取DWORD值

<Property Id="PreserveMySetting" Secure="yes"> 
    <RegistrySearch Id="FindExistingMySetting" 
        Root="HKLM" 
        Key="Software\!(loc.ProductManufacturer)\!(loc.ProductName)" 
        Name="MySetting" 
        Type="raw" 
        Win64="no" /> 
</Property> 

然後我使用由保存的值驅動的組件進行設置。

問題是,註冊表搜索以「格式化」字符串的形式返回DWORD,例如: #而不只是

這意味着,當我的組件設置註冊表項,它是作爲一個創建REG_SZ與值「#1」,即使你呃我已經表示它應該是一個整數;

<Component Id="MySettingKey" 
    Guid="{76C4B14C-14BC-42E1-91F0-75C9F2A20EC8}"> 
    <RegistryValue Id="MySetting" 
     Action="write" 
     Name="MySetting" 
     Value="[PreserveMySetting]" 
     Type="integer" 
     KeyPath="yes" 
     Key="Software\!(loc.ProductManufacturer)\!(loc.ProductName)" 
     Root="HKMU"/> 
</Component> 

是否有任何方法可以獲取組件使用的實際註冊表值?

回答

6

這將會倒退,但如果您將Type屬性更改爲字符串,它將起作用。使用ORCA查看MSI註冊表時,原因很明顯。

當您選擇整數WiX作者的「#[PRESERVEMYSETTING]」,並且當您選擇字符串作者的[PRESERVEMYSETTING]時。由於PRESERVEMYSETTING已經是#1,你希望它成爲#1而不是## 1。

<Component Id="MySettingKey" 
    Guid="{76C4B14C-14BC-42E1-91F0-75C9F2A20EC8}"> 
    <RegistryValue Id="MySetting" 
     Action="write" 
     Name="MySetting" 
     Value="[PRESERVEMYSETTING]" <!-- Secure Properties are PUBLIC properties --> 
     Type="string" 
     KeyPath="yes" 
     Key="Software\!(loc.ProductManufacturer)\!(loc.ProductName)" 
     Root="HKMU"/> 
</Component> 
+0

嗨克里斯托弗,感謝您的答覆。我測試了你推薦的內容,事實上,如果密鑰已經存在,那麼保存的值將按照預期設置。但是,我注意到這樣做的效果是在作爲REG_SZ進行乾淨安裝時創建密鑰,這顯然不希望發生。有沒有解決的辦法?用DWORD創建初始密鑰的一些方法,但是然後運行一個單獨的組件來使用保存的值來填充它? –

+0

如果該屬性尚未具有值,則可以擁有一個SetProperty自定義操作,該操作將該屬性設置爲#1。這應該可以幫助您僅使用1個組件來啓動泵。 –

+0

啊我的情況有點複雜,因爲有問題的註冊表項是可以從命令行指定的,但在用戶離開它時有一個默認值。我會嘗試在這裏嘗試一些不同的配置,看看哪個產生了正確的結果,但感謝指針。 –