安装程序按延期交货顺序设置属性
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 个功能。我落伍了。
我收到了使用讨论方法的 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 个功能。我落伍了。