Delphi Inno Setup中为何无法成功导入动态链接库DLL?
- 内容介绍
- 文章标签
- 相关推荐
本文共计410个文字,预计阅读时间需要2分钟。
我尝试对原文进行了简化,以下是不超过100个字的结果:
将Delphi DLL导入Inno Setup(Unicode),需简单步骤:定义`Foo`过程,导出`Foo`。在安装脚本中添加DLL到文件列表,标记`dontcopy`。
我没有运气将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 'Foo@MyDLL.dll stdcall';
但是,当我运行安装程序时,出现错误:
Cannot Import dll: <utf8>MyDLL.dll.
我究竟做错了什么?
由于您没有在函数导入中使用延迟加载,因此Inno Setup加载程序无法运行,因为它找不到您的库.这是因为检查函数导出是否可用是在触发InitializeSetup事件之前执行的,因此您的库尚未从存档中提取.在您的情况下,正确添加delayload导入选项.但是,如果添加文件,则可以省略手动提取并告诉安装程序为您提取库:库文件名之前的前缀.此前缀为documented:
During Setup, a special ‘files:’ prefix may also be used to instruct
Setup to automatically extract one or more DLLs from the [Files]
section before loading the first DLL.
您的案例中的整个导入可以缩短为:
[Files] Source: "MyDLL.dll"; Flags: dontcopy [Code] procedure Foo; external 'Foo@files:MyDLL.dll stdcall';
本文共计410个文字,预计阅读时间需要2分钟。
我尝试对原文进行了简化,以下是不超过100个字的结果:
将Delphi DLL导入Inno Setup(Unicode),需简单步骤:定义`Foo`过程,导出`Foo`。在安装脚本中添加DLL到文件列表,标记`dontcopy`。
我没有运气将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 'Foo@MyDLL.dll stdcall';
但是,当我运行安装程序时,出现错误:
Cannot Import dll: <utf8>MyDLL.dll.
我究竟做错了什么?
由于您没有在函数导入中使用延迟加载,因此Inno Setup加载程序无法运行,因为它找不到您的库.这是因为检查函数导出是否可用是在触发InitializeSetup事件之前执行的,因此您的库尚未从存档中提取.在您的情况下,正确添加delayload导入选项.但是,如果添加文件,则可以省略手动提取并告诉安装程序为您提取库:库文件名之前的前缀.此前缀为documented:
During Setup, a special ‘files:’ prefix may also be used to instruct
Setup to automatically extract one or more DLLs from the [Files]
section before loading the first DLL.
您的案例中的整个导入可以缩短为:
[Files] Source: "MyDLL.dll"; Flags: dontcopy [Code] procedure Foo; external 'Foo@files:MyDLL.dll stdcall';

