2012-01-05 57 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