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

如何在Excel 365 / VBA 7中调用gFortran编译生成的DLL

解决方案

核心问题根因

  • 原有代码中!MS$ATTRIBUTES是微软Fortran编译器专属指令,gFortran完全不识别,函数导出声明未生效
  • VBA声明默认按引用传参,与Fortran预期的参数传递方式不匹配
  • 编译时未打包静态运行时,DLL依赖MinGW动态库导致系统无法加载
  • 64位环境下原有stdcall调用约定已失效,无需额外声明

操作步骤

1. 调整Fortran源码

替换专属编译指令为gFortran支持的导出声明:

integer(2) function AddIt(iVal1,iVal2)
!GCC$ ATTRIBUTES dllexport :: AddIt
Integer(2) iVal1,iVal2
AddIt = iVal1 + iVal2
end function AddIt

2. 修改编译命令

使用64位MinGW-w64工具链执行编译,添加静态运行时打包参数:

gfortran -Wextra -Wall -pedantic -shared -static-libgcc -static-libgfortran -o .\Output\gTest.dll .\Source\gTest.F90

如果导出函数名仍不符合预期,可以新增gTest.def模块定义文件:

EXPORTS
AddIt

编译时加入def文件即可:

gfortran -Wextra -Wall -pedantic -shared -static-libgcc -static-libgfortran -o .\Output\gTest.dll .\Source\gTest.F90 .\Source\gTest.def

3. 修正VBA函数声明

添加ByVal指定按值传参,建议将DLL放到xlsm文件同目录,避免绝对路径引发的访问问题:

Declare PtrSafe Function AddIt Lib "gTest.dll" (ByVal iVal1 As Integer, ByVal iVal2 As Integer) As Integer

4. 验证测试

直接运行原有RunIt宏即可正常输出计算结果。如果仍有报错,可使用系统自带dumpbin /exports gTest.dll命令检查DLL导出表是否存在AddIt函数,确认DLL架构与Excel架构匹配(均为64位)。

内容的提问来源于stack exchange,提问作者Rogan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:15:05