You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NSIS脚本使用SYSTEM::CALL调用DLL函数无法获取返回值的问题求助

NSIS脚本使用SYSTEM::CALL调用DLL函数无法获取返回值的问题求助

兄弟,我之前也碰到过类似的问题,折腾了好一会儿才搞明白,我来帮你分析下可能的问题点和解决办法:

首先看你的代码和DLL函数声明,函数本身是没问题的——extern "C" __declspec(dllexport)已经保证了函数名不会被C++编译器修饰,导出名就是Add,这点你也确认过,那大概率是NSIS脚本里SYSTEM::CALL的语法或者环境匹配的问题。

最可能的问题:SYSTEM::CALL的语法错误

你之前的两种写法都有小问题,尤其是DLL路径没加.dll后缀,还有参数传递的格式不对。正确的调用格式应该是这样的:

Section loadDll
    StrCpy $0 7
    StrCpy $1 4 

    ; 关键修正:加上.dll后缀,参数传递用「类型 变量」的格式,返回值直接绑定.r2
    System::Call "$INSTDIR\NSISRegistryTool.dll::Add(i r0, i r1) i .r2"

    MessageBox MB_OK "Return value: $0, $1, $2"
    
    ; 可选:添加错误排查,如果还是空,看看系统错误码
    System::Call "kernel32::GetLastError() i .r3"
    MessageBox MB_OK "Last Error Code: $3"

    SetPluginUnload manual
    System::Free 0
SectionEnd

这里的核心细节:

  • 必须明确指定.dll后缀,SYSTEM::CALL需要完整的模块文件名才能正确加载
  • 参数传递要写成i r0(表示把$0的值作为int类型参数传入),而不是分开写(r0,r1)或者i $0
  • 返回值部分i .r2表示把函数返回的int值存入$2变量

其他需要排查的点

如果修正语法后还是不行,你可以检查这几个地方:

  • DLL位数和NSIS是否匹配:NSIS默认是32位编译器,如果你把DLL编译成了64位,就会调用失败,返回值为空。请确保DLL和NSIS的位数一致(要么都32位,要么都64位)
  • DLL路径是否正确:可以先弹个对话框确认路径:MessageBox MB_OK "DLL Path: $INSTDIR\NSISRegistryTool.dll",确保文件确实存在这个位置
  • 导出函数名是否真的正确:用dumpbin /exports NSISRegistryTool.dll或者Dependency Walker工具查看导出表,确认导出的函数名就是Add,没有额外的修饰符

错误码对应的问题

如果用GetLastError()拿到错误码,可以对应排查:

  • 126:找不到指定的DLL文件(路径错了或者文件不存在)
  • 127:找不到指定的函数(导出名不对或者DLL位数不匹配)

按照上面的步骤调整后,应该就能正常获取返回值了!

备注:内容来源于stack exchange,提问作者cloud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 13:49:36