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 如何确定现有应用程序的安装范围?_Wix_Windows Installer - Fatal编程技术网

Wix 如何确定现有应用程序的安装范围?

Wix 如何确定现有应用程序的安装范围?,wix,windows-installer,Wix,Windows Installer,我有一个基于WixUI_Advanced的安装程序,允许用户选择安装范围(每个用户或机器范围) 升级时(安装了具有较低版本的现有应用程序),我想隐藏安装范围屏幕,并自动选择他们上次选择的安装范围 如何判断上次安装使用的安装范围 编辑 查看我的MSI日志,可以发现我的现有安装: // Existing user specific installation FindRelatedProducts: Found application: {C5D3DCD0-4A97-4224-AF22-BDDEB3

我有一个基于WixUI_Advanced的安装程序,允许用户选择安装范围(每个用户或机器范围)

升级时(安装了具有较低版本的现有应用程序),我想隐藏安装范围屏幕,并自动选择他们上次选择的安装范围

如何判断上次安装使用的安装范围


编辑

查看我的MSI日志,可以发现我的现有安装:

// Existing user specific installation
FindRelatedProducts: Found application: {C5D3DCD0-4A97-4224-AF22-BDDEB357EEB7}
MSI (c) (C4:F0) [11:11:39:289]: PROPERTY CHANGE: Adding WIX_UPGRADE_DETECTED property. Its value is '{C5D3DCD0-4A97-4224-AF22-BDDEB357EEB7}'.
MSI (c) (C4:F0) [11:11:39:289]: PROPERTY CHANGE: Adding MIGRATE property. Its value is '{C5D3DCD0-4A97-4224-AF22-BDDEB357EEB7}'.

// Existing machine wide installation
MSI (c) (2C:4C) [11:03:19:258]: FindRelatedProducts: current install is per-user.  Related install for product '{C5D3DCD0-4A97-4224-AF22-BDDEB357EEB7}' is per-machine.  Skipping...
我可以看到检测到的
WIX\u升级
MIGRATE
属性仅在现有安装的范围与当前安装匹配时设置,这是有意义的。也许我可以直接使用
FindRelatedProducts

这不是一个完整的答案。我不得不补充一句作为回答,因为 格式要求


更新:看了这个,时间又用完了
这实际上根本不是答案,只是把它扔给你,以防它能帮助你自己研究它

注册表持久化:我假设您已尝试在注册表中持久化ALLUSERS和/或安装范围,并在更新的MSI中读取它?我没看那个。要想实现这一点,您必须在软件包的第一个版本中完成,并在以后继续进行

MSI API Automation:这里有一个小技巧,可以在盒子上找到以前安装的产品(基本上运行类似于MSI文件中的
“FindRelatedProducts”
):

MSI内部

<Binary Id='Scope.vbs' SourceFile='Debugging Custom Actions\Scope.vbs' />
<CustomAction Id='Scope.vbs' VBScriptCall='' BinaryKey='Scope.vbs' Execute='immediate' Return='ignore'/>

<..>

<InstallUISequence>
  <Custom Action='Scope.vbs' Before='CostInitialize' />      
</InstallUISequence>
Set upgrades=Session.installer.RelatedProducts(“INSERT-UPGRADE-code”)
对于升级中的每个u
scope=Session.installer.ProductInfo(u,“AssignmentType”)
MsgBox CStr(范围)
下一个
独立,直接运行脚本(首先使用指定的升级代码安装MSI):

Set installer=CreateObject(“WindowsInstaller.installer”)
设置升级=安装程序。相关产品(“插入升级代码”)
对于升级中的每个u
MsgBox“产品代码:”&u&vbNewLine&“安装上下文:”&installer.ProductInfo(u,“AssignmentType”)
下一个
MsgBox“完成”
我本想在GUI序列中执行类似的操作,但又没时间了:

如果范围=1,则
Session.Property(“alluser”)=“1”
Session.Property(“MSInstallPerUser”)=“”
Session.Property(“WixAppFolder”)=“WixPerMachineFolder”
其他的
Session.Property(“alluser”)=“2”
Session.Property(“MSInstallPerUser”)=“1”
Session.Property(“WixAppFolder”)=“WixPerUserFolder”
如果结束
WiX片段

<Binary Id='Scope.vbs' SourceFile='Debugging Custom Actions\Scope.vbs' />
<CustomAction Id='Scope.vbs' VBScriptCall='' BinaryKey='Scope.vbs' Execute='immediate' Return='ignore'/>

<..>

<InstallUISequence>
  <Custom Action='Scope.vbs' Before='CostInitialize' />      
</InstallUISequence>


我本想看看这个,但没时间了。基本上,检测到的WIX\u升级将在安装的新设置中设置。您可以使用该属性来确定是隐藏还是显示按钮。我简单地测试了一下,效果很好,但在WiX中实现起来比较困难。我认为你需要覆盖整个对话框

在MSI表中,它可能是这样的(Orca屏幕截图-):


  • (请查看第2节:
    更改默认对话框-高级对话框
加入更多链接:


我在注册表中检查了一个与
DisplayName
匹配的条目(灵感来自:

然后我抓取了
InstallLocation
的内容来确定安装范围:

if (installLocation == string.Empty)
{
    // Installed before we introduced scope => never set install location
    return ExistingInstallation.MachineWide;
}
else if (installLocation.Contains(_programFilesPath))
{
    return ExistingInstallation.MachineWide;
}
else
{
    return ExistingInstallation.UserSpecific;
}

覆盖整个对话框不是问题,我已经这样做了:P问题是
WIX\u UPGRADE\u DETECTED
仅在当前安装范围与现有安装的安装范围匹配时设置。因此,我正在尝试找出现有安装的安装范围。抱歉,无法正确查看此内容。添加了一个黑客小VBScript,试图获得以前的安装范围。看一看,先试试独立的,也许吧?您可能需要Win32/C++函数来获得适当的粒度和控制。我不确定。制作一个合适的双作用域MSI包是非常复杂的。正如人们在尝试时发现的那样。不用担心:)我希望MSI/Wix能设置一些神奇的变量,但看起来我可能不得不写一些代码:哦,看看你的注册表建议。那也行。让我胡闹一下。是的,我想我不需要提醒你,这是一个非常高的WTF因素——如果你原谅我的法语(或“所有事物中的居民邪恶”)。这项技术起了反作用。确保在多种安装模式下进行测试:
安装
修复
修改
自修复
修补
升级
,等等。。。MSI中有许多齿轮,它们之间的相互作用出乎意料。需要核心测试。啊,差点忘了。让我送你去。也许你已经看过了。如果你走注册中心的路,读一读非常重要。