gpt4 book ai didi

excel - 在 Excel 365/VBA 7 中使用 gFortran dll

转载 作者:行者123 更新时间:2023-12-04 19:50:05 25 4
gpt4 key购买 nike

多年来,我使用了用 Fortran PowerStation 和 Excel 02/03 编写的 dll 与 VBA 6 的组合。
但是进步在继续,我得到了一台装有 Windows 64 位、Excel 365(64 位)但没有 Fortran 的新机器。所以我从 SourceForge 下载了 gFortran 作为 MinGW-w64-for 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 箱的路径后,我从目录 . 编译它如下
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) 从 dll 导出,或使用模块定义 (.def) 文件。但是我看不出您如何将其中任何一个与 gFortran 一起使用(我已经尝试过)。
或者,可能,我没有为 64 位编译和链接?
有人可以帮帮我吗?将不胜感激。

最佳答案

!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 中的种类编号相对应。很有可能你真的想要 integer(8)或使用一些更便携的语法的等价物 Fortran: integer*4 vs integer(4) vs integer(kind=4)

关于excel - 在 Excel 365/VBA 7 中使用 gFortran dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69483167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com