多年来,我一直使用用Fortran PowerStation和Excel02/03和VBA6编写的dlls的组合。
但随着时间的推移,我得到了一台新机器,它安装了Windows 64位,Excel 365 (64位),没有Fortran。所以我从SourceForge下载了gFortran作为MinGW的一部分-w64-用于32位和64位Windows。现在我必须让它工作起来。下面是Fortran的源代码,在一个名为gTest.F90的文件中:
integer(2) function AddIt(iVal1,iVal2)
!MS$ATTRIBUTES dllexport, stdcall, alias:'AddIt' :: ADDIT
Integer(2) iVal1,iVal2
AddIt=iVal1+iVal2
end function AddIt(第二行指定Microsoft属性。稍后将详细介绍这一点。)
在将路径添加到添加到%PATH%中的MinGW bins之后,我将其从目录.中编译如下
gfortran -Wextra -Wall -pedantic -shared -fPIC -o .\Output\gTest.dll .\Source\gTest.F90这没有生成任何输出,但确实写入了文件gTest.dll。
以及Excel / VBA。我设置了一个小电子表格gTest.xlsm,它试图调用AddIt。它按如下方式声明AddIt:
Declare PtrSafe Function AddIt Lib "C:\A\Projects\gTest\Output\gTest.dll"(iVal1 As Integer, iVal2 As Integer) As Integer不走运。因此,我输入了以下VBA代码并逐步完成了它:
Sub RunIt()
Dim Val1 As Integer, Val2 As Integer, Sum As Integer
Val1 = 1
Val2 = 10
Sum = AddIt(Val1, Val2)
Debug.Print Val1, Val2, Sum
End Sub不出所料,它在Sum =上爆炸了,并显示了MS的一个更无用的错误消息"Error in loading DLL (Error 48)"。
现在,我怀疑问题在于我没有告诉dll必须导出其中的内容-上面的MS属性语句的函数。我看到在C++环境中,您可以使用关键字__declspec(dllexport)或使用模块定义(.def)文件从dll导出。但我看不出您如何在gFortran中使用这两种方法(我已经尝试过了)。或者,可能我没有编译和链接到64位?
有人能帮帮我吗?我将不胜感激。
发布于 2021-10-07 15:06:19
!MS$ATTRIBUTES被gfortran忽略,请尝试
!GCC$ ATTRIBUTES DLLEXPORT请参阅https://gcc.gnu.org/onlinedocs/gfortran/ATTRIBUTES-directive.html
STDCALL仅与32位相关。
也可以使用bind(C)设置别名
integer(2) function AddIt(iVal1,iVal2) bind(C, name='AddIt')请检查MS Powerstation中的种类号是否与gfortran中的种类号相对应。很可能您实际上想要使用一些更可移植的语法Fortran: integer*4 vs integer(4) vs integer(kind=4)的integer(8)或等效物
https://stackoverflow.com/questions/69483167
复制相似问题