我正在处理一个部署项目(基于Wix),该项目用于部署一个应用程序,以便使用AutoCAD运行,并在传递自己的参数时创建AutoCAD的acad.exe快捷键。
为此,有一个自定义操作dll (C++),它迭代Autocad的注册表项,获得"acad.exe“位置,并在运行时使用MyInstaller.msi中的MSI方法创建/更新快捷方式。
问题:
在x64位操作系统(如Windows 7 )上,自定义操作从注册表读取正确的“acad.exe”位置,即C:\Program \AutoCAD 2010\acad.exe,并在运行时更新msi中的快捷方式属性。但是,当msi完成创建快捷方式时,路径将转换为32位程序文件,即C:\Program (x86)\AutoCAD 2010\acad.exe,这实际上并不存在。
我的工作:
由于我的msi是32位(x86),所以我创建了一个带有属性Win64=Yes的单独组件,并修改了自定义操作以更新/创建该组件的快捷方式。但是,快捷方式中的目标路径仍被转换为C:\Program (x86)。
我知道如果我将MSI转换为x64操作系统,这可能会得到解决,但目前,我不能做这么大的改变。
有什么方法可以让32位的msi创建包含x64操作系统路径的快捷方式?
任何帮助都将是非常感谢的。
非常感谢。
发布于 2010-07-20 10:48:16
好的,我解决了:
的问题是,64位操作系统上的32位MSI 将路径(在快捷表中)转换为32位等效路径,即我们的自定义操作dll从64位注册表键获得AutoCAD的路径为C:\Program \AutoCAD 2010\,然后将该路径注入到MSI的快捷表和目录表中。但当MSI编写快捷方式时,它将其转换为C:\Program (x86)\AutoCAD 2010。
我们不能在32位MSI中有64位组件,但是副Versa是可能的,也就是我们可以在64位MSI中拥有32位组件。
然而,在我的例子中,我必须使用64位组件作为快捷方式,其他组件将保持32位。
,因此我已经将32位MSI转换为64位MSI,在包信息中添加了Plantform=x64。并将组件声明为Win64=Yes.。
这解决了我的问题,现在我找到了正确的捷径。
由于这一点,现在我有两个独立的安装程序,即每32位和64位分别。
诚挚的问候
法鲁克
发布于 2010-07-18 14:25:11
你正向上游游去,在这一条上与MSI对抗。(虽然我能理解为什么。)
从官方角度来看,MSI从来都不是平台上的秘密。我假设您使用自定义操作读取注册表值,因为MSI的AppSearch/Reglocator将将您限制在WoWSys64节点上。在此之后,MSI将取代即使是硬编码的对程序文件的引用,作为应用程序兼容性方法的一部分(基本上,microsoft假设您不知道自己在做什么,并且他们知道您真正想做的是什么)。
非正式地读这条帖子,找出我想要解决的黑客。总结是,如果您将C:\Program \转换为一个短路径( 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,x86是一个x86 MSI ),充当AutoCAD的前端启动程序。让它查询注册表并找到文件,然后启动它或显示一条消息,说明如果找不到AutoCAD是不可用的。
如果你这样做,你的安装就会变得更干净。
https://stackoverflow.com/questions/3274999
复制相似问题