我想在我的 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 应该以不同的方式工作。