首页 > 解决方案 > WiX:如果注册表项不存在,则设置它,并防止在重大升级时将其删除

问题描述

我的目标是在全新安装或升级时设置注册表项值(如果它尚不存在)。为此,我从注册表搜索中定义了一个属性,并向我的组件添加了一个条件:

    <Property Id="AN_ID_HERE">
        <RegistrySearch Id="anIdHere"
                      Root="HKCU"
                      Key="Path\To\Key"
                      Name="Value"
                      Type="raw"/>
    </Property>

    <Fragment>
        <Component Id="MyComponentId" Guid="xxx">
            <Condition>
                <![CDATA[(NOT AN_ID_HERE)]]>
            </Condition>
            <RegistryKey Root="HKCU" Key="Path\To\Key">
                <RegistryValue Type="integer" Name="Value" Value="1" KeyPath="yes"/>
            </RegistryKey>
        </Component>
    </Fragment>

这导致密钥被删除而不是被重大升级替换,大概是因为AN_ID_HERE它在评估时具有一些价值(在删除注册表项之前)。我还尝试添加NOT UPGRADINGPRODUCTCODE条件以防止密钥被删除,但这没有任何效果。

我尝试了一个我看到的称为“记住属性模式”的解决方案:http ://robmensching.com/blog/posts/2010/5/2/the-wix-toolsets-remember-property-pattern/ 。我对这种方法的问题是,RegistrySearch它将读取值为 1 的 REG_DWORD 作为“#1”,因此新的注册表值将设置为 REG_SZ,这对我的目的不起作用。

标签: wixwindows-installerregistry

解决方案


推荐阅读