2014-01-29 154 views
3

我没有任何运气将Delphi DLL导入到Inno安装程序(Unicode)中。该DLL有一个简单的方法..Inno安装程序无法导入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. 

我在做什么错?

+0

本来不错,如果创新安装了一个更具描述性错误消息,例如,比方说,例如'文件未找到MyDLL.dll' –

+0

引发此异常的是Pascal脚本引擎。但是,是的,Inno Setup端可能会检查该文件是否存在于库的['CodeRunnerOnDllImport'](https://github.com/jrsoftware/issrc/blob/is-5_5_4/Projects/Main.pas#L2031)事件方法中它们在初始化时加载(不是强制延迟加载)。如果库不存在,它会报告一些更明智的信息,终止安装并避免尝试从不存在的库文件导入功能。是的,这样的支票就没问题。 – TLama

回答

7

因为我们还没有在你的函数导入使用延迟加载,Inno Setup的加载失败,因为它运行没有找到你的图书馆。这是因为在触发InitializeSetup事件之前检查功能导出是否可用,因此您的库尚未从存档中提取。

你的情况是加入delayload导入选项的正确方法。但是,如果在库文件名之前添加files:前缀,则可以省略手动提取并告诉安装程序为您提取库。这个前缀是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 '[email protected]:MyDLL.dll stdcall'; 
2

我找到了解决方案通过在进口使用delayload发布了这个问题之后...

function DoFoo(): Bool; 
    external '[email protected] stdcall delayload'; 
相关问题