Inno Setup 32位和64位dll安装

7
如果操作系统是64位,我想安装一个32位的DLL到“Program Files(x86)”文件夹,并将64位的DLL安装到“Program Files”文件夹中,并分别注册它们。如果是32位OS,我只想将文件复制到常规程序文件夹并注册。
如何在Inno Setup中实现这一点?另外,64位DLL是否将由64位“regsvr32”程序注册?
以下是我的代码。它在32位OS上运行良好,但在64位OS上会把两组文件都倾倒到“Program Files(x86)”中。
[Files]
Source: D:\..\32bit files\mylibrary.dll; DestDir: {app}; \
    Flags: restartreplace ignoreversion regserver 32bit

Source: D:\..\64bit files\mylibrary.dll; DestDir: {app}; \
    Flags: restartreplace ignoreversion regserver 64bit; Check: IsWin64

我看了一下64BitTwoArch.iss的示例,但它只是介绍如何进行32位或64位的安装,而不是32位和64位的安装。


3
如果你想在64位Windows上安装这两个文件且每个文件的目标文件夹不同,那么你不能同时使用相同的“DestDir”来安装它们。也没有一个“好”的解决方案可以将它们安装在不同的文件夹中,因为实际上这不是你应该做的事情(而且你也不能保证{app}位于{pf}之下)。最佳解决方案要么只安装与操作系统匹配的一个文件,要么将它们都安装在同一个文件夹中并使用不同的文件名。 - Miral
我支持@Miral的说法。你可以使用一堆丑陋的字符串操作来处理{app},但是不能保证用户首先安装它在{pf}中。 - Nyerguds
2个回答

4

我已经成功使用以下方法:

[Files]
Source: D:\..\32bit files\mylibrary.dll; DestDir: {app}; \
    Flags: restartreplace ignoreversion regserver 32bit; **Check: "not IsWin64"**

Source: D:\..\64bit files\mylibrary.dll; DestDir: {app}; \
    Flags: restartreplace ignoreversion regserver 64bit; Check: IsWin64

destdir对于两者都是{app}。那么它不会将64位和32位都复制到同一个位置吗?我希望64位被复制到64位程序文件位置,而32位被复制到x86程序文件。 - Ali
不,它只会复制与系统位数匹配的版本。根据Inno帮助文档:“当在文件名和工作目录参数中使用时,将{sys}常量映射到64位系统目录。这是64位模式安装的默认行为。此标志仅可在Setup运行于64位Windows时使用,否则将出现错误。在支持32位和64位架构的安装中,可以通过添加Check: IsWin64参数来避免错误,这将导致在32位Windows上运行时该条目被静默跳过。” - GAR8
这并没有回答问题,因为它确实将两个文件都安装到同一个位置({app}解析为用户选择的安装文件夹,当使用64bit标志时,它不会自动映射到64位等效位置)。另一方面,这是大多数情况下的正确解决方案。例如,如果您的应用程序是32位的,但也有64位版本的shell扩展,您仍然需要将shell扩展与其他二进制文件一起安装到32位的“Program Files”中。但是您可以使用64bit标志使其在64位上注册。 - Martin Prikryl

3

由于您想要在两个目标上同时安装,因此无法仅使用{app}变量使其正常工作。

可以通过硬编码程序文件夹来解决此问题,例如:

#define MyAppName "TestAPP"

[Files]
Source: D:\..\32bit files\mylibrary.dll; DestDir: {pf32}\{#MyAppName}; \
    Flags: restartreplace ignoreversion regserver 32bit

Source: D:\..\64bit files\mylibrary.dll; DestDir: {pf64}\{#MyAppName}; \
    Flags: restartreplace ignoreversion regserver 64bit; Check: IsWin64

这对我来说很有效。Windows会自动为32位应用程序加载32位dll,为64位应用程序加载64位dll。

1
当我运行上述脚本时,会出现错误:“无法注册DLL/OCX:RegSvr32以0x4的退出代码失败”. 我猜测我的x64 Windows无法处理x86注册包含。有什么解决方法吗? - Chagbert
看起来这是一个注册组件的问题而不是复制文件。尝试运行regsvr32并单独查看该组件,查看问题所在。如果是32位dll,请确保使用32位regsvr32。默认情况下,它可能会使用64位regsvr32。还要确保安装程序具有正确的管理员特权。 https://support.microsoft.com/en-us/kb/282747 - Ali
虽然这样做可以解决问题,但通常正确的解决方案是 @GAR8 的答案。您不想将单个64位DLL安装到64位“Program Files”中。您应该将其与其他二进制文件一起保存,以供您(假定)的32位应用程序使用。 - Martin Prikryl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接