我想在我的Inno安装脚本中使用我在Delphi中创建的DLL(比如'A.dll'),它使用了一堆其他的DLL('B.dll','C.dll', ...)。所有这些dll文件都包含在Files-section中,如下所示:
[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)。
提前感谢您的帮助! :)
编辑:当我使用其中一个“外来”DLL(B.dll,C.dll,...)时,通过调用其中一个方法来获取实际错误在Inno设置期间.dll:
Access violation at address 00408CC7 in module 'setup.tmp'. Read of adress 00000000.
编辑2 :我想我意识到为什么我的问题发生了:在我自己的A.dll中发现了 ExtractFilePath (第一个链接),我发现了不是在{tmp}内执行,而是在设置开始时创建的另外两个临时目录之一。看来,不是{tmp},而是将当前工作目录(因此执行inno的目录)添加到库搜索路径(第二个链接)。这可以解释为什么只有在手动复制到其他临时目录时才能访问其他库(B.dll,C.dll,...)。我认为A.dll是从{tmp}中提取和调用的,没有问题,因为它在 external 命令中被称为“主库”。我认为使用 loadwithalteredsearchpath ,其他库可以保留在同一目录中,但这似乎不起作用。
但是我怎么能以一种漂亮的方式解决这个问题呢?我想我可以手动将DLL复制到setup-path(通过使用 ExtractFilePath(ParamStr(0)),然后将它们解压缩到{tmp}以解决问题。但这似乎是在Inno Setup中使用DLL的脏方法应该以不同的方式工作。
答案 0 :(得分: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"
希望这有帮助。