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

时间:2010-07-18 09:32:38

标签: installer 64-bit wix windows-installer 32-bit

我正在开发一个部署项目(基于Wix),该项目用于部署应用程序以使用AutoCAD运行,并在传递自己的参数时创建AutoCAD的acad.exe快捷方式。

为实现此目的,有一个自定义操作DLL(C ++),它遍历Autocad的注册表项并获取“acad.exe”位置,并在运行时使用MyInstaller.msi中的MSI Api方法创建/更新快捷方式。 / p>

问题:

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

我的工作:

由于我的msi是32位(x86),所以我创建了一个单独的Component,其属性为Win64 = Yes,并修改了Custom Action以更新/创建该组件的快捷方式。但仍然将快捷方式中的目标路径转换为C:\ Program Files(x86)。

我知道如果我将我的MSI转换为x64操作系统,这可能会解决,但目前我无法做出如此大的改变。

32位msi有没有办法创建包含x64 OS路径的快捷方式?

真的很感激任何帮助..

非常感谢。

2 个答案:

答案 0 :(得分:1)

你正在游泳上游对抗MSI。 (虽然我能理解为什么。)

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

非正式地阅读这个帖子,找到一个我想通过解决的问题。总结是我发现,如果你将C:\ Program Files \转换为一个短路径(C:\ Progra~1),那么MSI就不够聪明,无法弄清楚你所指的是什么,所以它不能代替这个值。

http://www.joyofsetup.com/2010/03/27/wix-msbuild-v2-0-and-x64-systems/

请注意,这是一个黑客攻击,并且没有办法告诉微软是否会在将来的版本中“修复它”。我能想到的另一种方法是你不要使用快捷方式表而是编写自定义动作来为你创建快捷方式。

如果您不想与MSI游泳,请考虑此解决方法。创建一个小的64位EXE(是的,您可以将64位或AnyCPU exe部署到Program Files x86是x86 MSI),它充当AutoCAD的前端启动器。让它查询注册表并找到该文件,然后启动它,或者显示一条消息,说明如果找不到AutoCAD则无法使用。

如果你这样做,你可以使你的安装更加清洁。

答案 1 :(得分:0)

好的,我能够解决它:

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

我们不能在32位MSI中使用64位组件,但是反Versa是可能的,即我们可以在64位MSI中拥有32位组件。

但是,在我的情况下,我必须使用64位组件作为快捷方式,其他组件将保持32位。

所以我将32位MSI转换为64位MSI,在Package信息中添加了Plantform = x64。并将组件声明为Win64 = Yes。

这解决了我的问题,现在我在快捷方式中获得了正确的路径。

由于这个原因,现在我有2个独立的安装程序,分别是每个32位和64位。

祝你好运

法鲁克