安装程序按延期交货顺序设置属性

installer sets properties in back order

我收到了使用讨论方法的 WiX 代码

我的Product.wxs:

    <!-- begin hack - detect windows 10 -->
    <!-- Check if system is windows 10:  -->
    <Property Id="WIN10FOUND">
      <DirectorySearch Id="searchSystem" Path="[SystemFolder]" Depth="0">
        <FileSearch Id="searchFile" Name="advapi32.dll" MinVersion="6.3.10000.0"/>
      </DirectorySearch>
    </Property>

    <SetProperty Action="SetIsWindow10False"  Id="ISWIN10" After="FindRelatedProducts" Value="0"><![CDATA[WIN10FOUND = ""]]></SetProperty>
    <SetProperty Action="SetIsWindow10True"  Id="ISWIN10" After="FindRelatedProducts" Value="1"><![CDATA[WIN10FOUND <> ""]]></SetProperty>
    <!-- end hack - detect windows 10 -->

    <SetProperty Action="SetMyDriverPathToInstallDir"  Id="MYDRRVPATH" After="FindRelatedProducts" Value=""><![CDATA[ISWIN10 <> 1]]></SetProperty>
    <SetProperty Action="SetMyDriverPathToInstallDir_Win10"  Id="MYDRVPATH" After="FindRelatedProducts" Value="MyDrvDriverWin10\"><![CDATA[ISWIN10 = 1]]></SetProperty>

...

    <InstallExecuteSequence>
...
      <Custom Action="InstallMyDriverDriver" Before="InstallFinalize"><![CDATA[(NOT Installed AND NOT REMOVE) AND VDIENV <>"1" AND NOQOS <> "1" AND ISWIN10 = 0]]></Custom>
      <Custom Action="InstallMyDriverDriver10" Before="InstallFinalize"><![CDATA[(NOT Installed AND NOT REMOVE) AND VDIENV <>"1" AND NOQOS <> "1" AND ISWIN10 = 1]]></Custom>
...
    </InstallExecuteSequence>

但是从安装程序日志中我看到这些属性的顺序是颠倒的

MSI (s) (FC:A4) [16:19:02:683]: Doing action: SetMyDriverPathToInstallDir
MSI (s) (FC:A4) [16:19:02:683]: Note: 1: 2205 2:  3: ActionText 
Action ended 16:19:02: SetCredentialFilter. Return value 1.
Action start 16:19:02: SetMyDriverPathToInstallDir.
MSI (s) (FC:A4) [16:19:02:684]: Skipping action: SetMyDriverPathToInstallDir_Win10 (condition is false)
MSI (s) (FC:A4) [16:19:02:684]: Doing action: SetIsWindow10False
MSI (s) (FC:A4) [16:19:02:684]: Note: 1: 2205 2:  3: ActionText 
Action ended 16:19:02: SetMyDriverPathToInstallDir. Return value 1.
MSI (s) (FC:A4) [16:19:02:685]: PROPERTY CHANGE: Adding ISWIN10 property. Its value is '0'.
Action start 16:19:02: SetIsWindow10False.
MSI (s) (FC:A4) [16:19:02:685]: Skipping action: SetIsWindow10True (condition is false)
MSI (s) (FC:A4) [16:19:02:685]: Skipping action: SetUpgrading (condition is false)
MSI (s) (FC:A4) [16:19:02:685]: Doing action: SetVersion
MSI (s) (FC:A4) [16:19:02:685]: Note: 1: 2205 2:  3: ActionText 
Action ended 16:19:02: SetIsWindow10False. Return value 1.
...
MSI (s) (FC:A4) [16:19:02:695]: PROPERTY CHANGE: Adding WIN10FOUND property. Its value is 'C:\Windows\SysWOW64\advapi32.dll'.

即WIN10FOUND 首先定义但最后调用 驱动程序的路径最后定义但首先调用

因此,驱动程序的安装路径未针对 Win10 进行更正,存在一些问题。

有人可以帮助我了解安装程序设置属性顺序不正确的原因吗?

我猜你的问题是因为你正在使用它来设置你所有的属性。

After="FindRelatedProducts"

假设这是您的初始执行顺序:

.
.
FindRelatedProducts

然后你说:

<SetProperty Action="SetIsWindow10False"  Id="ISWIN10" After="FindRelatedProducts" Value="0"><![CDATA[WIN10FOUND = ""]]></SetProperty>

你的执行顺序是这样的:

.
.
FindRelatedProducts
SetIsWindow10False

然后你说:

<SetProperty Action="SetMyDriverPathToInstallDir_Win10"  Id="MYDRVPATH" After="FindRelatedProducts" Value="MyDrvDriverWin10\"><![CDATA[ISWIN10 = 1]]></SetProperty>

你的执行顺序是这样的:

.
.
FindRelatedProducts
SetMyDriverPathToInstallDir_Win10
SetIsWindow10False

最后你的执行顺序是这样的:

.
.
FindRelatedProducts
SetMyDriverPathToInstallDir_Win10
SetMyDriverPathToInstallDir
SetIsWindow10True
SetIsWindow10False

如果您需要特定的顺序,请尝试这样的操作:

<SetProperty Action="SetIsWindow10False"  Id="ISWIN10" After="FindRelatedProducts" Value="0"><![CDATA[WIN10FOUND = ""]]></SetProperty>
<SetProperty Action="SetIsWindow10True"  Id="ISWIN10" After="SetIsWindow10False" Value="1"><![CDATA[WIN10FOUND <> ""]]></SetProperty>
<!-- end hack - detect windows 10 -->

<SetProperty Action="SetMyDriverPathToInstallDir"  Id="MYDRRVPATH" After="SetIsWindow10True" Value=""><![CDATA[ISWIN10 <> 1]]></SetProperty>
<SetProperty Action="SetMyDriverPathToInstallDir_Win10"  Id="MYDRVPATH" After="SetMyDriverPathToInstallDir" Value="MyDrvDriverWin10\"><![CDATA[ISWIN10 = 1]]></SetProperty>

这将导致如下结果:

.
.
FindRelatedProducts
SetIsWindow10False
SetIsWindow10True
SetMyDriverPathToInstallDir
SetMyDriverPathToInstallDir_Win10

要检查序列将如何执行,您可以使用 Orca 打开安装程序,这是查看安装程序内部结构的最佳工具。

我几周前就这个问题写了这个答案:Windows 10 not detecting on installshield. I suppose the WindowsBuild property 在这个链接的答案中描述的是(当前)确定你是否在 Windows 上的一种方法10 或没有。列出的其他选项也可能有效——我只是没有对它们进行太多测试。我不确定你的具体需求是什么。

如其他地方所述,您不应该再检查 OS 版本,而是检查您需要 的 OS 功能(可能有已被管理员禁用)。又一实例证明理论上理论和实践应该没有区别,但实际上有。

我将与其他人一起检查如何正确检查这 Windows 10 个功能。我落伍了。