【发布时间】:2014-07-29 19:04:55
【问题描述】:
我无法让 Inno-Setup 加载我的 DLL。 我看过类似的帖子,但其中提供的解决方案似乎都没有帮助。特别是,this 帖子非常接近,但似乎不是完全相同的问题。
我的安装程序在我的测试系统上运行良好。我的 DLL 是用 C++ 编写的,使用 VS 2010。有一个 DEF 文件。我已成功使用 VS 调试器附加到安装程序的线程并逐步执行我的代码。一切都是好的。发布版本在我的测试系统上运行得很好,不涉及调试器。安装程序调用我的 DLL 并且它可以工作。
然后我将我的安装程序带到一个不同的原始系统中进行试用。每次,当我启动安装程序时,它都会以通常的 UAC 提示开始:“你想允许来自未知发布者的以下程序对这台计算机进行更改吗?”我说“是的”。然后我会听到哔声和提示:
Runtime Error (at -1:0):
Cannot import
dll:<utf8>C:\Users\Logicrat\AppData\Local\Temp\is-4E245\MyDLL.dll
在我的设置脚本中
[Files]
Source: "MyDLL.dll"; DestDir: "{app}"; Flags : dontcopy
和
function MyFunc(hWnd: Integer; lpText, lpCaption: AnsiString; uType: Cardinal): Integer;
external 'MyFunc@files:MyDLL.dll stdcall setuponly';
根据 Inno 文档,如果不需要 DLL 进行卸载,dontcopy 标志是合适的,但事实并非如此。
我怀疑问题在于指定 DLL 的确切位置,因为我的脚本要求它位于 {app} 目录中,但错误消息指的是临时目录。我尝试了许多脚本的变体,结果都一样。
我的开发/测试系统和我的原始目标系统都是 Windows 7(32 位)。我已经为此努力了好几个星期,但没有明显的进展。任何建议都将受到欢迎。
【问题讨论】:
-
检查您导入的函数名称是否与导出函数的名称完全匹配(区分大小写)。您的脚本的其余部分似乎是正确的。
-
@TLama 是的,它确实匹配。我怀疑它不会在我的测试系统上运行。我也在函数声明中尝试了
__declspec(dllexport)和__stdcall的变体;它在我的开发机器上总是能正常工作,而在其他机器上却不行。 -
啊,它肯定不会在你的机器上运行。好吧,你怀疑那条路,但它是正确的。通过
files:MyDLL.dll,您告诉脚本引擎将MyDLL.dll库从[Files]部分提取到安装程序的临时文件夹并从那里加载它,这似乎发生了。看来您是从this example开始的,对吗?它对你有用吗(没有任何修改)? -
@TLama 不,我以前没见过这个例子。我首先使用了一些随 Inno Setup 一起安装的示例 .iss 文件,以及 Inno 文档中的几个 Pascal 脚本示例。我的印象是 Inno Setup 无法在目标系统上定位我的 DLL。我已经在我的 Inno 脚本所在的开发系统上的同一文件夹中拥有 DLL 的副本,以便可以将其包含在构建中。
-
您不是该目标系统上某些防病毒沙箱的受害者吗?因为
files:前缀可以使用很长时间(并且按照我描述的方式工作)。还是您的库不依赖于另一个库(设置中缺少该库)?附言该错误信息非常广泛;它发生在很多情况下,所以不要确定它只是找不到列出的库。
标签: c++ dll inno-setup