Inno setup Inno设置32位和64位dll安装

Inno setup Inno设置32位和64位dll安装,inno-setup,32bit-64bit,Inno Setup,32bit 64bit,如果操作系统是64位的,我想在程序文件(x86)文件夹中安装32位DLL,在程序文件文件夹中安装64位DLL,并分别注册它们。如果是32位操作系统,我只想将文件复制到普通程序文件夹并注册 如何在Inno设置中执行此操作?64位DLL是否也将由64位regsvr32程序注册 这是到目前为止我的代码。它在32位操作系统上运行良好,但在64位操作系统上,它会将两组文件转储到程序文件(x86)中 我已经看过了64BitTroarch.iss示例,但它告诉我们如何进行32位或64位安装,而不是32位和64

如果操作系统是64位的,我想在
程序文件(x86)
文件夹中安装32位DLL,在
程序文件
文件夹中安装64位DLL,并分别注册它们。如果是32位操作系统,我只想将文件复制到普通程序文件夹并注册

如何在Inno设置中执行此操作?64位DLL是否也将由64位
regsvr32
程序注册

这是到目前为止我的代码。它在32位操作系统上运行良好,但在64位操作系统上,它会将两组文件转储到
程序文件(x86)


我已经看过了
64BitTroarch.iss
示例,但它告诉我们如何进行32位或64位安装,而不是32位和64位安装。

我在以下方面取得了成功:

[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

无法使其仅与
{app}
变量一起工作,因为您希望同时在两个目标上安装

通过像这样硬编码program files文件夹解决了这个问题

#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。

这两种应用程序的destdir都是{app}。那么,它不会将64位和32位复制到同一个位置吗?我希望将64位复制到64位程序文件位置,将32位复制到x86程序文件位置。不,它将只复制与系统位匹配的版本。根据Inno帮助:“导致{sys}”常量,用于在文件名和WorkingDir参数中使用时映射到64位系统目录。这是64位模式安装中的默认行为。此标志只能在安装程序在64位Windows上运行时使用,否则将发生错误。在同时支持32位和64位体系结构的安装中,可以避免错误:添加Check:IsWin64参数,该参数将导致在32位Windows上运行时自动跳过该项。“这并不能回答问题,因为它确实将两个文件安装到同一位置(
{app}
解析到用户选择的安装文件夹,当使用
64位
标志时,它不会神奇地映射到64位等效文件夹)。另一方面,这是大多数情况下的正确解决方案。例如,如果您的应用程序是32位的,但也有64位版本的shell扩展,那么您仍然会将shell扩展以及其余的二进制文件安装到32位的“程序文件”中。但是您可以使用
64位
标志将其注册为64位。如果您希望在64位窗口上安装这两个文件,并且每个文件的目标文件夹不同,则不能对这两个文件使用相同的
DestDir
。在不同的文件夹中安装它们也没有一个“好”的解决方案,因为这实际上不是你应该做的事情(而且你不能保证{app}在{pf}下)。最好的解决方案是要么只安装一个与操作系统匹配的文件,要么将它们安装在具有不同文件名的同一文件夹中。您可以在{app}上使用一系列难看的字符串操作来完成此操作,但不能保证用户会首先在{pf}中安装它。当我运行上述脚本时,我收到错误:“无法注册DLL/OCX:RegSvr32失败,退出代码为0x4”。我的猜测是,我的x64 Windows无法很好地处理包含x86注册的问题。有没有办法解决这个问题?这似乎是注册组件而不是复制文件的问题。尝试单独运行regsvr32和组件,并查看问题。如果是32位dll,请确保使用的是32位regsvr32。默认情况下,它可以使用64位regsvr32。还要确保安装程序具有正确的管理员权限。虽然这符合问题的要求,但通常正确的解决方案是。您不想将一个单独的64位DLL安装到64位“程序文件”。您可以将它与其他二进制文件一起保存,以用于(假定的)32位应用程序。
#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