如何导入两个同名的 DLL(x86 和 x64)?

Posted

技术标签:

【中文标题】如何导入两个同名的 DLL(x86 和 x64)?【英文标题】:How to import two DLLs with the same name (x86 and x64)? 【发布时间】:2020-03-02 07:02:42 【问题描述】:

当我从两个 DLL(一个用于 32 位,另一个用于 64 位)导入一个函数时,我得到一个错误,有没有办法做到这一点?

我试过的代码是这样的:

function DriverPackageInstallW(DriverPackageInfPath: Integer; Flags: Cardinal; pInstallerInfo: AnsiString ; pNeedReboot: Boolean): Cardinal;
external 'DriverPackageInstallW@files:difxapi_x86.dll';

function DriverPackageInstallW(DriverPackageInfPath: Integer; Flags: Cardinal; pInstallerInfo: AnsiString ; pNeedReboot: Boolean): Cardinal;
external 'DriverPackageInstallW@files:difxapi_x64.dll';

我收到的错误是这样的:

重复标识符“DRIVERPACKAGEINSTALLW”

【问题讨论】:

【参考方案1】:

回答您的字面问题:您可以将这些函数以不同的名称导入 Inno Setup/Pascal 脚本。

function DriverPackageInstallW_32(DriverPackageInfPath: Integer; Flags: Cardinal; pInstallerInfo: AnsiString ; pNeedReboot: Boolean): Cardinal;
external 'DriverPackageInstallW@files:difxapi_x86.dll';

function DriverPackageInstallW_64(DriverPackageInfPath: Integer; Flags: Cardinal; pInstallerInfo: AnsiString ; pNeedReboot: Boolean): Cardinal;
external 'DriverPackageInstallW@files:difxapi_x64.dll';

但是!您不能将 64 位 DLL 加载到 32 位 Inno Setup 进程中。那是行不通的。

通常,您不能在一个进程中混合使用 32 位和 64 位代码。


如果您需要在 Inno Setup(或任何 32 位应用程序)中调用 64 位 DLL,则必须引入一个加载和调用 DLL 的帮助程序 64 位 EXE。您可以在 Inno Setup 中执行该帮助程序 EXE。

【讨论】:

Martin,谢谢你的澄清,我试试,我只是担心 UAC(用户帐户控制)在安装过程中会出现两次.. 不,不应该。从已经提升的应用程序运行应用程序时,不再需要 UAC。

以上是关于如何导入两个同名的 DLL(x86 和 x64)?的主要内容,如果未能解决你的问题,请参考以下文章

DllImport 自动选择x64或x86 dll

x64 的 SQLite3.dll

使用来自 x64 注入器的 x86 dll 注入 x86 目标

如何知道在构建中使用哪个 cpu(x86 x64 或 AnyCpu)?

使用 .Net 提供额外的 platform.dependent .dll

DllImport 自动选择x64或x86 dll