我需要为我的应用程序设置一个默认数据库文件。我只想在初始安装时设置它。如果注册表值——sdf文件路径的字符串——发生了变化,那么以后的升级不应该尝试将该值设置回默认值。
另一个警告,这似乎是一个问题,虽然,如果他们从来没有设置数据库文件,用户应该能够使用一个默认数据库的程序,而不必经过设置。
所以我用value="[INSTALLFOLDER]dust.sdf"设置DATABASEFILE。但是candle在抱怨[INSTALLFOLDER]:
The 'DATABASEFILE' Property contains '[INSTALLFOLDER]' in its value which is an illegal reference to another property. If this value is a string literal, not a property reference, please ignore this warning. To set a property with the value of another property, use a CustomAction with Property and Value attributes.
因此,按照错误说明,我添加了一个自定义操作。现在,自定义操作总是覆盖DATABASEFILE属性。我希望它只在注册表中不存在该值时重写该值。
代码如下:
<CustomAction Id='SetINSTALLFOLDERREF' Property='DATABASEFILE' Value='[INSTALLFOLDER]dust.sdf' Execute='immediate' />
<Property Id='DATABASEFILE' >
<RegistrySearch Id='DatabaseFile' Type='raw' Root='HKCU' Key='SoftwareDBGDustDatabase' Name='File'/>
</Property>
您是否使用Id=SetINSTALLFOLDERREF为自定义操作设置了条件?如果没有,你可能想要这样做。
在你的自定义操作上设置一个NOT DATABASEFILE的条件应该就足够了。
对于上述条件,
—在新安装的情况下,注册表项不存在。因此,DATABASEFILE为NULL,自定义操作条件求值为true,并执行自定义操作SetINSTALLFOLDERREF。
-对于任何后续的维护操作,注册表项存在,属性DATABASEFILE将始终包含一个值,自定义操作条件的计算结果为FALSE,并且将不会触发自定义操作。
您可能想要做的另一件事是将属性DATABASEFILE添加到SecureCustomProperties列表中。