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

时间:2013-11-06 13:24:39

标签: dll installation nsis setup-deployment

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

我正在使用NSIS脚本来调用使用Visual C ++编译并导出一些C函数的A.dll。和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?提前致谢。抱歉英语不好。希望你们明白我的意思。

1 个答案:

答案 0 :(得分: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)'