从 Excel 编写 Fortran/calling 中的 DLL

Writing a DLL in Fortran/calling from Excel

我正在尝试在 Fort运行 中编写一些数字功能,以后可以在 Excel 中访问这些功能。我正在使用 Office 2013(64 位)、Visual Studio 2015 "Community" 和 Intel Fort运行(Intel Parallel Studio XE 2017);并且我能够正确编译可执行程序。我还能够生成 DLL 文件,我认为这是正确的。

这是我从 this tip:

中得出的最小 Fort运行 代码示例
function id(x)
    !DEC$ ATTRIBUTES DLLEXPORT :: id
    integer :: id, x
    id = x
    return
end function

我在工作表 1 的 VBA 代码下的 Excel 一侧有这个:

Option Explicit
Option Base 1
Public Declare PtrSafe _
    Function id Lib "mydll.dll" _
    (ByVal x As Integer) As Integer

通过这样做,我设法让 Excel 中的公式栏自动完成函数名称,但评估任何实例都会导致单元格短暂闪烁 0,然后变为 #VALUE!。

我已经尝试了很多 combinatorial/cargo 狂热的方式:使用 ByRef 而不是 ByVal,让函数只使用整数或单精度(实数*4)或双精度(real*8)浮动,然后是更没有意义的东西。

我终于从 运行dom 键组合中 运行 混搭了,而且很少有资源涵盖这个确切的用例。如果我必须把它归结为比 "what to do next" 更精确的东西:

您似乎没有意识到英特尔 Fortran 提供了几个连接 Excel/VBA 和 Fortran 的实例。从 https://software.intel.com/en-us/product-code-samples 下载适用于 Windows 示例包的英特尔 Parallel Studio XE。在 ZIP 文件中,compiler_f\MixedLanguage\Excel 可能是与您最相关的一个。一个重要的方面是来自 VBA 的任何调用都需要在被调用例程端指定 STDCALL 调用机制,否则你会得到堆栈损坏。

这是来自 Intel visual Fortran 帮助文件的片段。

subroutine FortranCall (r1, num)
    !DEC$ ATTRIBUTES DLLEXPORT, STDCALL, REFERENCE, ALIAS:"FortranCall" :: FortranCall
    integer, intent(in) :: r1
    character(10), intent(out) :: num
    !DEC$ ATTRIBUTES REFERENCE :: num

    num = ''
    write (num,'(i0)') r1 * 2

return
end subroutine FortranCall

在 excel 方面,他们使用了:

Declare Sub FortranCall Lib "C:\Temp\Fcall.dll" (r1 As Long, ByVal num As String)

最好能获得更多具有不同输入和输出的示例来帮助用户。