Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wix 在失败的RegistrySearch未运行后设置属性的自定义操作_Wix - Fatal编程技术网

Wix 在失败的RegistrySearch未运行后设置属性的自定义操作

Wix 在失败的RegistrySearch未运行后设置属性的自定义操作,wix,Wix,其目的是,如果在注册表中找不到该值,则我希望分配一个默认值,然后将该值作为默认值显示在安装程序UI的字段中。我实际想要使用的默认值是[ComputerName],但显然我不能在属性值属性中直接使用[ComputerName],因为它会在编译时给我带来错误,特别是: 警告CNDL1077:“MYPROPERTY”属性包含“[ComputerName]” 在其值中,这是对另一个属性的非法引用。如果 此值是字符串文字,不是属性引用 忽略此警告。使用另一个属性的值设置属性的步骤 属性,将CustomAc

其目的是,如果在注册表中找不到该值,则我希望分配一个默认值,然后将该值作为默认值显示在安装程序UI的字段中。我实际想要使用的默认值是[ComputerName],但显然我不能在属性值属性中直接使用[ComputerName],因为它会在编译时给我带来错误,特别是:

警告CNDL1077:“MYPROPERTY”属性包含“[ComputerName]” 在其值中,这是对另一个属性的非法引用。如果 此值是字符串文字,不是属性引用 忽略此警告。使用另一个属性的值设置属性的步骤 属性,将CustomAction与属性和值属性一起使用

在我尝试[ComputerName]之前,我想让它以纯文本的形式工作,但到目前为止,我甚至无法让它工作

在我的项目中,我有一个Product.wxs文件,其中包含Product元素、许多自定义操作(大多数操作运行良好,但它们都在以后显著运行)和以下元素,这些元素不配合,并且都是Product元素下的同级元素

属性定义和注册表搜索:

<Property Id="MYPROPERTY" Value="ADefaultValue">
    <RegistrySearch Id="MyProperty" Type="raw" Root="HKLM" Win64="$(var.Win64)"
                  Key="Software\MyCompany\MyApplication" Name="MyProperty" />
</Property>
<CustomAction Id="SetMyPropertyDefault" Property="MYPROPERTY" Value="MyCustomValue" Execute="immediate"/>
<InstallExecuteSequence>
    <Custom Action="SetMyPropertyDefault" After="AppSearch"><![CDATA[MYPROPERTY="ADefaultValue"]]></Custom>
</InstallExecuteSequence>

自定义操作定义:

<Property Id="MYPROPERTY" Value="ADefaultValue">
    <RegistrySearch Id="MyProperty" Type="raw" Root="HKLM" Win64="$(var.Win64)"
                  Key="Software\MyCompany\MyApplication" Name="MyProperty" />
</Property>
<CustomAction Id="SetMyPropertyDefault" Property="MYPROPERTY" Value="MyCustomValue" Execute="immediate"/>
<InstallExecuteSequence>
    <Custom Action="SetMyPropertyDefault" After="AppSearch"><![CDATA[MYPROPERTY="ADefaultValue"]]></Custom>
</InstallExecuteSequence>

自定义操作执行:

<Property Id="MYPROPERTY" Value="ADefaultValue">
    <RegistrySearch Id="MyProperty" Type="raw" Root="HKLM" Win64="$(var.Win64)"
                  Key="Software\MyCompany\MyApplication" Name="MyProperty" />
</Property>
<CustomAction Id="SetMyPropertyDefault" Property="MYPROPERTY" Value="MyCustomValue" Execute="immediate"/>
<InstallExecuteSequence>
    <Custom Action="SetMyPropertyDefault" After="AppSearch"><![CDATA[MYPROPERTY="ADefaultValue"]]></Custom>
</InstallExecuteSequence>

这对我根本不起作用

对于我尝试过的自定义元素内容:

<Custom Action="SetMyPropertyDefault" After="AppSearch"><![CDATA[MYPROPERTY="ADefaultValue"]]></Custom>

<Custom Action="SetMyPropertyDefault" After="AppSearch">1</Custom> // I thought this would always run the custom action.

<Custom Action="SetMyPropertyDefault" After="AppSearch">NOT MYPROPERTY</Custom> // Back when I wasn't using the default value on the property at all.

1//我认为这将始终运行自定义操作。
NOT MYPROPERTY//Back当我根本不使用属性的默认值时。
结果总是一样的,我仍然在UI中显示“ADefaultValue”,而不是备用的“MyCustomValue”

根据我看到的每一篇博客和帖子,我都在做我应该做的事情,但显然我遗漏了什么。
有什么想法吗


更新/回答:

<Property Id="MYPROPERTY" Value="ADefaultValue">
    <RegistrySearch Id="MyProperty" Type="raw" Root="HKLM" Win64="$(var.Win64)"
                  Key="Software\MyCompany\MyApplication" Name="MyProperty" />
</Property>
<CustomAction Id="SetMyPropertyDefault" Property="MYPROPERTY" Value="MyCustomValue" Execute="immediate"/>
<InstallExecuteSequence>
    <Custom Action="SetMyPropertyDefault" After="AppSearch"><![CDATA[MYPROPERTY="ADefaultValue"]]></Custom>
</InstallExecuteSequence>
@sutarmin anton提供的我遗漏的一条信息是,InstallUISequence在InstallExecuteSequence之前运行(对我来说似乎是违反直觉的,但就是这样)。
但实际上,我不需要在每个安装序列元素中显式复制自定义操作调用,而是使用了SetProperty元素。
现在,我在Product.wxs中将以下内容作为Product元素的子元素:

<Property Id="MYPROPERTY">
    <RegistrySearch Id="MyProperty" Type="raw" Root="HKLM" Win64="$(var.Win64)" Key="Software\MyCompany\MyApplication" Name="MyProperty" />
</Property>

<SetProperty Id="MYPROPERTY" After="AppSearch" Value="[ComputerName]">NOT MYPROPERTY</SetProperty>

不是我的财产

它现在在InstallUISequence和InstallExecuteSequence中运行after AppSearch,但第二次运行NOT My属性时将显示为false,因此不会重置它,当然,如果它在安静模式下运行,它仍然可以正常工作。

当您在安装程序UI中运行时,安装在InstallUISequence中。InstallExecuteSequence在所有UI事件之后运行。这是您没有看到“MyCustomValue”的原因。要在UI序列之前更改属性,应将自定义操作置于“InstallUISequence”中


顺便问一下,为什么不将属性的默认值设置为“MyCustomValue”?然后,如果AppSearch无法在regisrty中找到值,它只会保留您试图手动设置的默认值。

您可能会使事情过于复杂。如果不设置默认值,则根本不会设置MYPROPERTY值。因此,如果“不是MYPROPERTY”,则调用CA进行设置

我知道你已经试过了,我想说这是一种正确的方法,我会尝试去诊断,而不是尝试其他方法。详细的日志将是无价的。做一个:

msiexec/i[msi的路径]/l*vx[文本日志文件的路径]

并查看CA的名称、AppSearch的功能、属性值等


您对“我不能使用[ComputerName]-如果这是问题,为什么不告诉我们发生了什么,也许有一个解决方案不需要所有这些。例如,编译错误是什么?

谢谢@sutarmin anton。将其移动到InstallUISequence工作正常,但我对该部分的理解是,如果安装程序在安静模式下运行,它将根本不会运行。我需要支持静默模式,因此虽然这会使自定义操作运行,但遗憾的是,它不能满足我的场景所需的内容。@Nanhydrin,我刚刚告诉了您如何在UI中查看已更改的属性。对于您的场景,您可以在InstallUISeq和InstallExecSeq中复制自定义操作,或者将属性的默认值设置为“MyCustomValue”“。这是第二种情况,您可能根本不需要使用自定义操作。我只是将MyCustomValue用作一个简单的测试用例。我实际上想要使用的默认值是[ComputerName]参数,但似乎不可能直接将其用作属性默认值,显然我必须使用自定义操作才能将默认值设置为属性。但是我明白你的意思了,我没有意识到UI one是先运行的,所以我需要像你说的那样将我的自定义操作放在这两个方面。谢谢@phildw,我用最初的编译错误更新了我的问题,但这正是让我首先使用自定义操作的原因。我已经登录了,我只记录到我的自定义操作没有运行,但我不明白为什么,但现在我明白了,这是因为自定义操作与我运行它的方式顺序错误。