在Fortran中编写DLL /从Excel调用

时间:2016-12-28 00:37:05

标签: visual-studio fortran excel-addins intel-fortran

我试图在Fortran中编写一些可以在Excel中访问的数字功能。我正在使用Office 2013(64位),Visual Studio 2015和#34;社区"和英特尔Fortran(英特尔Parallel Studio XE 2017);我能够正确编译可执行程序。我也能够生成DLL文件,我认为这是正确的。

这是我从this tip开始研究的最小Fortran代码示例:

function id(x)
    !DEC$ ATTRIBUTES DLLEXPORT :: id
    integer :: id, x
    id = x
    return
end function

我在Sheet1的VBA代码下的Excel端有这个:

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

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

我在组合/货物崇拜方式中尝试了很多东西:使用ByRef代替ByVal,函数只使用整数或单精度(真* 4)或双-precision(real * 8)浮动,然后是那些没有意义的东西。

我终于用完了随机密钥组合进行混搭,并且很少有消息来源涵盖这个确切的用例。如果我必须把它归结为更精确的事情而不是"接下来要做什么":

  • 我遇到问题是因为数字类型或与阻抗不匹配有关的问题" Fortran和Excel世界之间?
  • 我是否缺少必要的样板,胶水代码等?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

以下是英特尔可视Fortran帮助文件的摘录。

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

在excel方面,他们使用了:

Panel title = <%=this.panelLayout%> 

最好通过不同的输入和输出来获取更多示例来帮助用户。