Installation 32位MSI:将64位应用程序的快捷目标路径转换为32位路径

Installation 32位MSI:将64位应用程序的快捷目标路径转换为32位路径,installation,64-bit,wix,windows-installer,32-bit,Installation,64 Bit,Wix,Windows Installer,32 Bit,我正在处理一个部署项目(基于Wix),该项目用于部署应用程序以与AutoCAD一起运行,并在传递自身参数的同时创建AutoCAD的acad.exe的快捷方式 为了实现这一点,有一个自定义操作dll(C++),它可以迭代Autocad的注册表项,获取“acad.exe”位置,并在运行时使用MyInstaller.MSI中的MSI Api方法创建/更新快捷方式 问题: 在x64位操作系统(如Windows 7)上,自定义操作是从注册表读取正确的“acad.exe”位置,即C:\Program Fil

我正在处理一个部署项目(基于Wix),该项目用于部署应用程序以与AutoCAD一起运行,并在传递自身参数的同时创建AutoCAD的acad.exe的快捷方式

为了实现这一点,有一个自定义操作dll(C++),它可以迭代Autocad的注册表项,获取“acad.exe”位置,并在运行时使用MyInstaller.MSI中的MSI Api方法创建/更新快捷方式

问题:

在x64位操作系统(如Windows 7)上,自定义操作是从注册表读取正确的“acad.exe”位置,即C:\Program Files\AutoCAD 2010\acad.exe,并在运行时更新msi中的快捷方式属性。但是,当msi完成创建快捷方式时,路径将转换为32位程序文件,即C:\program files(x86)\AutoCAD 2010\acad.exe,但实际上并不存在

我的工作环境:

由于我的msi是32位(x86),所以我创建了一个属性为Win64=Yes的单独组件,并修改了自定义操作以更新/创建此组件的快捷方式。但仍将快捷方式中的目标路径转换为C:\Program文件(x86)

我知道,如果我将MSI转换为x64操作系统,这可能会得到解决,但目前,我不能做这么大的改变

32位msi有没有办法创建包含x64操作系统路径的快捷方式

如蒙帮助,我们将不胜感激


非常感谢。

这一次,你正在逆流而上对抗MSI。(尽管我能理解原因。)

官方MSI从来都不是平台nuetral。我假设您正在使用自定义操作读取注册表值,因为MSI的AppSearch/Reglocator会将您约束到WoWSys64节点。在那之后,MSI甚至将取代对程序文件的硬编码引用,作为应用程序兼容性方法的一部分(基本上,microsoft假定您不知道自己在做什么,并且他们知道您真正想做什么)

非正式地-阅读这篇文章,找到一个我想出的解决这个问题的方法。总结是,我发现如果将C:\Program Files\转换为短路径(C:\Progra~1),MSI就没有足够的智能来理解您所指的内容,因此它不会替换该值

请注意,这是一种黑客行为,无法判断微软是否会在未来的版本中“修复”。我唯一能想到的另一种方法是不使用快捷方式表,而是编写自定义操作来为您创建快捷方式

如果你不想和MSI一起游泳,考虑一下这一点。创建一个小的64位EXE(是的,可以将64位或任意CPU EXE部署到程序文件x86是x86 MSI),作为AutoCAD的前端启动器。使其查询注册表表并查找文件,然后启动该文件,或者显示一条消息,如果找不到AutoCAD,则说明AutoCAD不可用


如果您这样做,您的安装将更加干净。

您在这一次的MSI上逆流而上。(尽管我能理解原因。)

官方MSI从来都不是平台nuetral。我假设您正在使用自定义操作读取注册表值,因为MSI的AppSearch/Reglocator会将您约束到WoWSys64节点。在那之后,MSI甚至将取代对程序文件的硬编码引用,作为应用程序兼容性方法的一部分(基本上,microsoft假定您不知道自己在做什么,并且他们知道您真正想做什么)

非正式地-阅读这篇文章,找到一个我想出的解决这个问题的方法。总结是,我发现如果将C:\Program Files\转换为短路径(C:\Progra~1),MSI就没有足够的智能来理解您所指的内容,因此它不会替换该值

请注意,这是一种黑客行为,无法判断微软是否会在未来的版本中“修复”。我唯一能想到的另一种方法是不使用快捷方式表,而是编写自定义操作来为您创建快捷方式

如果你不想和MSI一起游泳,考虑一下这一点。创建一个小的64位EXE(是的,可以将64位或任意CPU EXE部署到程序文件x86是x86 MSI),作为AutoCAD的前端启动器。使其查询注册表表并查找文件,然后启动该文件,或者显示一条消息,如果找不到AutoCAD,则说明AutoCAD不可用


如果您这样做,您的安装将更加干净。

好的,我能够解决这个问题:

问题是,64位操作系统上的32位MSI正在将路径(在快捷方式表中)转换为32位等效路径,即我们的自定义操作dll正在从64位注册表项获取AutoCAD的路径,即C:\Program Files\AutoCAD 2010\并将此路径注入MSI的快捷方式表和目录表。但当MSI编写快捷方式时,它正在将其转换为C:\Program Files(x86)\AutoCAD 2010

我们不能在32位MSI中包含64位组件,但也可以在32位MSI中包含64位组件

然而,在我的例子中,我必须使用64位组件作为快捷方式,而其他组件将保持32位

因此,我已将32位MSI转换为64位MSI,并在包信息中添加Plantform=x64。并将组件声明为Win64=Yes。

这解决了我的问题,现在我在捷径中找到了正确的路径

因此,现在我有两个独立的安装程序,即分别用于32位和64位

致意


法鲁克

好的,我能解决它:

问题是,64位操作系统上的32位MSI正在将路径(在快捷方式表中)转换为32位等效路径,即我们的自定义操作dll正在从64位注册表项获取AutoCAD的路径,即C:\Program Files\AutoCAD 2010\并将此路径注入MSI的快捷方式表和目录表。但当MSI编写快捷方式时,它正在将其转换为C:\Program Files(x86)\AutoCAD 2010

我们不能