繁体   English   中英

我如何调用一个使用NSIS系统插件导入另一个dll的dll

[英]How can i call a dll that import another dll using NSIS system plugin

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

我正在使用NSIS脚本来调用A.dll,该文件是使用Visual C ++编译并导出一些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吗? 提前致谢。 对不起,英语不好。 希望你们明白我的意思。

加载程序找不到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)'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM