如何在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
相关产品推荐
相关产品推荐

