0

我是 NSIS 安装程序的新手。我得说 NSIS 部署很棒。但最近我遇到了一个问题。

我正在使用 NSIS 脚本调用使用 Visual C++ 编译的 A.dll 并导出一些 C 函数。和 A.dll 导入 B.dll。所以我在安装一开始就将它们(A.dll 和 B.dll)解压到 $PLUGINSDIR。

之后,我调用 System::call 来调用 A.dll 的“test()”。但它总是返回“错误”。我还做了一个删除 B.dll 导入的测试,“test()”可以正常工作并返回我期望的值。

这是代码:

;extract dll file

InitPluginsDir

SetOutPath $PLUGINSDIR

File "A.dll"

File "B.dll"

............

;call it
code:
System::Call "$PLUGINSDIR\A::test() i.r0"

$0 返回“错误”

删除 B.dll 的导入并重新编译 A.dll 后。test() 工作正常。

谁能解释我如何调用一个使用 NSIS 系统插件导入另一个 dll 的 dll?提前致谢。对不起英语不好。希望你们明白我的意思。

4

1 回答 1

0

加载程序找不到 B.dll,因此 A.dll 上的 LoadLibrary(由 system.dll 调用)将失败。

您可以设置工作目录:

Push $outdir ; Save current, not required
SetOutPath $pluginsdir
System::Call "$PLUGINSDIR\A::test() i.r0"
pop $outdir
SetOutPath $outdir ; Restore

或者您可以自己加载 B.dll:

System::Call 'KERNEL32::LoadLibrary(t "$PLUGINSDIR\B.dll")i.s'
System::Call "$PLUGINSDIR\A::test() i.r0"
System::Call 'KERNEL32::FreeLibrary(is)'
于 2013-11-07T23:50:05.050 回答