在Inno Setup中从{tmp}调用连续的DLL
我想使用一个DLL(可以说'A.dll'),我使用Delphi创建的Inno Setup脚本中使用了一系列其他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,...)只能在手动复制到其他临时目录时才能访问。 我假设A.dll从{tmp}中解压缩并调用,没有问题,因为它在外部命令中被称为“主库”。 我认为使用loadwithalteredsearchpath其他库可能会保留在同一个目录中,但这似乎不起作用。
但是我怎样才能以一种漂亮的方式解决这个问题? 我认为我可以手动将DLL复制到设置路径(通过使用ExtractFilePath(ParamStr(0)) ,然后将它们解压到{tmp}以解决问题。但是,这似乎是一个肮脏的解决方法,因为在Inno Setup应该以不同的方式工作。
那么我不知道你是否只加载DLL而不注册它们在系统注册表中。 然而,你的第一个编辑显示了由访问某些注册表堆栈所引发的错误,所以我认为你是。 在那种情况下,我只是使用一个批处理文件(在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:myFolderRegisterDevExpress.bat"
希望这可以帮助。
链接地址: http://www.djcxy.com/p/44517.html