Inno Setup 无法导入 DLL,并显示“无法导入 dll”

问题描述 投票:0回答:2

我没有运气将 Delphi DLL 导入 Inno Setup (Unicode)。 DLL 有一个简单的过程..

procedure Foo(); stdcall;
begin

end;

exports
  Foo;

DLL 包含在安装程序源中,并添加到文件列表中:

[Files]
Source: "MyDLL.dll"; Flags: dontcopy

然后,我在初始化中提取这个DLL:

function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('MyDLL.dll');
end;

最后,在脚本中声明这个过程:

function DoFoo(): Bool;
  external '[email protected] stdcall';

但是,当我运行安装程序时,出现错误:

Cannot Import dll: <utf8>MyDLL.dll.

我做错了什么?

delphi dll inno-setup pascalscript
2个回答
15
投票

由于您在函数导入中没有使用延迟加载,Inno Setup 加载器无法运行,因为它没有找到您的库。这是因为检查函数导出是否可用是在

InitializeSetup
事件触发之前执行的,因此您的库尚未从存档中提取。

在您的情况下,以正确的方式添加

delayload
导入选项。但是,如果您在库文件名前添加
files:
前缀,则可以省略手动提取并告诉安装程序为您提取库。这个前缀是
documented
为:

在安装过程中,还可以使用特殊的“文件:”前缀来指示 设置自动从 [Files] 中提取一个或多个 DLL 加载第一个 DLL 之前的部分。

您的案例中的整个导入可以缩短为:

[Files]
Source: "MyDLL.dll"; Flags: dontcopy

[Code]
procedure Foo;
  external 'Foo@files:MyDLL.dll stdcall delayload';

4
投票

我在发布此问题后立即通过在导入上使用

delayload
找到了解决方案...

function DoFoo(): Bool;
  external '[email protected] stdcall delayload';
© www.soinside.com 2019 - 2024. All rights reserved.