2012-01-05 56 views
3

我們的應用程序需要最新版本的DLL才能正常運行。 DLL的路徑存儲在註冊表中。如何在Windows安裝程序中強制執行最低文件版本作爲啓動條件?強制執行註冊表值引用的最小DLL版本

到目前爲止,我有這樣的:

<Property Id="FileTest"> 
    <RegistrySearch Id="FileSearch" 
        Key="SOFTWARE\Company\Product" 
        Name="DLLPath" 
        Root="HKLM" 
        Type="file"> 
     <FileSearch MinVersion="1.2.3.4" /> 
    </RegistrySearch> 
</Property> 
<Condition Message="!(loc.ErrorMessage)">Installed OR (FileTest)</Condition> 

但維克斯不會編譯如下:

MainApp.wxs(543) : error CNDL0010 : The FileSearch/@Name attribute was not found; it is required. 

的問題是我不知道該怎麼對name屬性輸入。我事先並不知道DLL的名稱,它可能是任何東西! (這就是爲什麼註冊表值是存在的!)

回答

3

如果您修改RegistrySearch這會發生什麼:

<Property Id="FileTest"> 
    <RegistrySearch Id="FileSearchResult" 
        Key="SOFTWARE\Company\Product" 
        Name="DLLPath" 
        Root="HKLM" 
        Type="file"> 
     <FileSearch LongName="[FileSearchResult]" 
        MinVersion="1.2.3.4" /> 
    </RegistrySearch> 
</Property> 

我認爲有FileSearch同時作爲ID和實際WiX的因素導致你和問題。如果您更改ID,像FileSearchResult,然後在FileSearch元素的Name(或更安全,LongName)屬性引用(通過它封閉在方括號,[]),那麼它應該工作。我沒碰過威克斯在6個月左右,所以我不作任何承諾;)

注:括號是維克斯UtilExtensions(如圖this example)識別存儲在variable屬性RegistrySearch結果的方式。訪問在標準wix中保存結果的Id可能不是這樣。

注2:你實際上可能需要使用RegistrySearchRef元素作爲父到FileSearch元素來代替。看看this example(儘管它在另一個DirectorySearch中使用了DirectorySearch元素的一個結果)。希望這可能會讓你繼續下去。

+0

事實上,事實證明,「名稱」可以是任何東西 - 當FileSearch是RegistrySearch的一部分時,它會被完全忽略!在「名稱」中輸入一些亂碼,搜索仍然有效。我不知道爲什麼在這種情況下該領域仍然是必需的。順便說一下,使用方括號的方法並不奏效,因爲Signature表中的相應列只是一個Text數據類型,而不是Formatted。 – 2012-01-06 16:14:04

+0

另一個要做的事情是在「FileSearch」元素中包含「語言」屬性,這是我缺少的。如果我搜索的版本號與發現的版本號完全匹配,則這會導致搜索失敗。 (這在簽名表文檔中都有描述。) – 2012-01-06 16:15:55

+0

另外,不推薦LongName;它會在使用時觸發警告。 – 2012-01-06 16:16:28