首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Excel365/VBA7中使用gFortran动态链接库

在Excel365/VBA7中使用gFortran动态链接库
EN

Stack Overflow用户
提问于 2021-10-07 14:45:14
回答 1查看 139关注 0票数 3

多年来,我一直使用用Fortran PowerStation和Excel02/03和VBA6编写的dlls的组合。

但随着时间的推移,我得到了一台新机器,它安装了Windows 64位,Excel 365 (64位),没有Fortran。所以我从SourceForge下载了gFortran作为MinGW的一部分-w64-用于32位和64位Windows。现在我必须让它工作起来。下面是Fortran的源代码,在一个名为gTest.F90的文件中:

代码语言:javascript
复制
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之后,我将其从目录.中编译如下

代码语言:javascript
复制
gfortran -Wextra -Wall -pedantic -shared -fPIC -o .\Output\gTest.dll .\Source\gTest.F90

这没有生成任何输出,但确实写入了文件gTest.dll。

以及Excel / VBA。我设置了一个小电子表格gTest.xlsm,它试图调用AddIt。它按如下方式声明AddIt:

代码语言:javascript
复制
Declare PtrSafe Function AddIt Lib "C:\A\Projects\gTest\Output\gTest.dll"(iVal1 As Integer, iVal2 As Integer) As Integer

不走运。因此,我输入了以下VBA代码并逐步完成了它:

代码语言:javascript
复制
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位?

有人能帮帮我吗?我将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2021-10-07 15:06:19

!MS$ATTRIBUTES被gfortran忽略,请尝试

代码语言:javascript
复制
!GCC$ ATTRIBUTES DLLEXPORT

请参阅https://gcc.gnu.org/onlinedocs/gfortran/ATTRIBUTES-directive.html

STDCALL仅与32位相关。

也可以使用bind(C)设置别名

代码语言:javascript
复制
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)或等效物

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69483167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档