3

我想在我的 Inno Setup 脚本中使用我在 Delphi 中创建的 DLL(比如说“A.dll”),该脚本使用了一堆其他 DLL(“B.dll”、“C.dll”、... )。所有这些 dll 文件都包含在文件部分中,如下所示:

[Files]
Source:"libs\*.dll"; Flags: dontcopy

在代码部分中,我按照在线帮助中的说明声明了所用 DLL 的方法,并添加了loadwithalteredsearchpath标志:

procedure MyMethod; external 'MyMethod@files:A.dll,B.dll,C.dll stdcall loadwithalteredsearchpath';

当安装程序启动时,所有需要的文件都被复制到常量 {#tmp} 指向的临时目录中。然而,MyMethod开始执行它就很好(用一些 Showmessages 检查它),但是当方法尝试使用其他 DLL 时,整个事情都会中断。

在 {#tmp} 的临时文件夹旁边,在安装过程中创建了另外两个临时目录(都使用 'IS-xxxxx.tmp' 模式),其中包含 'setup.tmp' (在 {#tmp} 中没有出现)。当我现在在安装开始时手动将所有 DLL(A.dll 除外)复制到这两个其他目录中时,一切正常。但是当我让它只按照我的脚本中的定义运行时,A.dll 似乎找不到其他库。

有谁知道,为什么会发生这种情况以及我该如何解决?这似乎是 PATH 的问题,但我认为 Inno Setup 将 tmp-dir 添加到 PATH 中,以便安装程序可以找到 DLL(它确实可以找到,但奇怪的是仅适用于 A.dll)。

在此先感谢您的帮助!:)

编辑:我得到的实际错误是,当我在 Inno 设置期间通过在 A.dll 中调用它们的方法之一来使用“外部”DLL(B.dll、C.dll、...)之一时:

Access violation at address 00408CC7 in module 'setup.tmp'. Read of adress 00000000.

编辑 2:我想我意识到我的问题发生的原因:在我自己的 A.dll 中使用ExtractFilePath(第一个链接)我发现,setup.exe 不是在 {tmp} 内执行,而是另外两个临时目录之一是在设置开始时创建。看起来,不是 {tmp} 而是当前工作目录(因此是执行 inno 的目录)被添加到库搜索路径(第二个链接)。这可以解释为什么其他库(B.dll、C.dll、...)只能在手动复制到这个其他临时目录时才能访问。我想从 {tmp} 中提取和调用 A.dll 没有问题,因为它在外部命令中被称为“主库” 。我认为使用loadwithalteredsearchpath其他库可以保留在同一目录中,但这似乎不起作用。

但是我现在怎么能以一种漂亮的方式解决这个问题呢?我想我可以将 DLL 手动复制到设置路径(通过使用ExtractFilePath(ParamStr(0)),在它们被提取到 {tmp} 以解决问题之后。但这似乎是一个肮脏的解决方法,因为在Inno Setup 应该以不同的方式工作。

  1. 如何获取临时 Inno 安装文件所在的路径
  2. 具有多个相关 DLL 的外部函数调用
4

1 回答 1

0

好吧,我不确定您是否只加载 DLL 而没有在系统注册表中注册它们。但是,您的第一个 EDIT 显示由尝试访问某些注册表堆栈触发的错误,所以我假设您是。在这种情况下,我只需使用一个批处理文件(在 CMD 控制台中触发命令)来注册我的 DLL,就像我会一样:

 @echo off
 echo Registering DevExpress DLLs
 %~dp0gacutil.exe /i %~dp0DevExpress.BonusSkins.v12.1.dll
 %~dp0gacutil.exe /i %~dp0DevExpress.Charts.v12.1.Core.dll

所以,我把它放在 iss 脚本的 RUN 部分:

[Run]
Filename:C:\myFolder\RegisterDevExpress.bat"

希望这可以帮助。

于 2015-06-09T07:00:08.393 回答