我正在尝试将Fortran动态链接库(DLL)与VB.NET应用程序链接起来。 DLL中包含的子程序应该修改VB端提供的值c
,但它没有这样做:它保持c
不变。
这是Fortran代码:
SUBROUTINE prueba_int(m,n,p)
!DEC$ ATTRIBUTES DLLEXPORT, DECORATE, ALIAS : "prueba_int" :: prueba_int
!DEC$ ATTRIBUTES REFERENCE :: m,n
IMPLICIT NONE
INTEGER, INTENT(IN) :: m,n
INTEGER,INTENT(OUT) :: p
p=m*n
END SUBROUTINE
这是VB.NET部分:
Public Class Form1
Public Declare Sub prueba_int Lib "Dll2.dll path" (ByRef m As Integer, ByRef n As Integer, ByRef p As Integer)
Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click
ofd.Filter = "(*txt)|*.txt"
If (ofd.ShowDialog() = DialogResult.OK) Then
txtArray.Text = ofd.FileName
End If
End Sub
Private Sub btnCalc_Click(sender As Object, e As EventArgs) Handles btnCalc.Click
Dim a, b, c As Integer
a = CInt(txt1.Text)
b = CInt(txt2.Text)
c = 1
Call prueba_int(a, b, c)
MsgBox(c) 'Only to check c's value
End Sub
End Class
我已尝试使用LONG
代替INTEGER
,但问题仍然存在。有人能给我一个关于这个问题的线索吗?
编辑:VB.NET和FORTRAN代码都是使用Visual Studio 2015和英特尔Fortran编译器(Parallel XE 2017)编写的。 DLL是使用STDCALL(/iface:stdcall)
调用约定构建的。
答案 0 :(得分:0)
我已经找到了解决方案。我唯一做的就是用这个改变出口线:
!DEC$ ATTRIBUTES DLLEXPORT, STDCALL, REFERENCE, ALIAS : "prueba_int" :: prueba_int
!DEC$ ATTRIBUTES REFERENCE :: m,n
现在它有效!如果其他人遇到同样的问题,这个帖子很有用: https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/276310