![](/img/trans.png)
[英]How can i call a dll that import another dll using NSIS system plugin
[英]NSIS: calling DLL function with System::Call using absolute path with blanks
我正在尝试从 myfile.dll 调用 function int MyFunction()
并在消息框中显示它的返回值。
到目前为止有效的方法:
SetOutPath "$TEMP"
File "myfile.dll"
;File "System.dll" for some time I thought one needs to copy the plugin, but that's not needed
MessageBox MB_OK "$0"
System::Call '$TEMP\myfile.dll::MyFunction()i.r0'
MessageBox MB_OK "$0"
System::Free 0
一旦我用$INSTDIR
替换$TEMP
,它就不再起作用了。 实际上它确实如此,只要$INSTDIR
不包含空格,不幸的是C:\Program Files (x86)
会...
有一次,我从这个 NSIS 论坛帖子中发现这种行为是一个错误,即this . 我并没有真正弄清楚它的状态。
我还尝试了两个页面中都显示的kernel32::LoadLibrary
和kernel32::GetProcAddress
的解决方法,但我不知道在System::Call "::$1(the usual parameters here)"
行中使用什么。
那么我现在如何调用 MyFunction() 呢?
系统插件现在支持路径中的引号:
System::Call '"$InstDir\MyLibrary.dll"::MyFunction(i 42)'
如果 DLL 依赖于同一目录中的其他 DLL,但单个 DLL 应该在没有它的情况下工作,则需要调用 KERNEL32::AddDllDirectory。
使用 kernel32::GetProcAddress 时参数相同,只是路径和 function 名称改为直接地址。
最终修复它的是将$INSTDIR
添加到搜索路径中,如this answer中所建议的那样:
System::Call 'KERNEL32::AddDllDirectory(w "$INSTDIR")'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.