我可以毫无问题地来回传递所有这些的整数,单数,双数和数组。但我无法弄清楚如何将Visual Basic 2010中的字符串传递给Fortran DLL中的字符变量。我一直收到PInvokeStackImbalance
错误。我可以将Visual Basic字符串转换为包含每个字符的ASCII代码的整数数组,发送它,然后转换回DLL内部,但这是可悲的。必须有一个简单的方法来做到这一点。
我首先尝试在VB2010中使用Dim txt(50) as Char
,在DVF F90 DLL中使用character*50 txt
,但这不起作用。
然后我在Visual Basic 2010中尝试Dim txt as String
并将字符串设置为50个字符(也尝试了49个字符),但这不起作用。
我希望那里的其他人想要将文件名等传递给他们的DLL。
答案 0 :(得分:1)
我用C#做过,很简单:
FORTRAN CODE(Compaq Visual Fortran)
SUBROUTINE TEST_STR(A, N)
!DEC$ ATTRIBUTES DLLEXPORT :: TEST_STR
!DEC$ ATTRIBUTES ALIAS:'TEST_STR' :: TEST_STR
!DEC$ ATTRIBUTES VALUE :: N
INTEGER*4, INTENT(IN) :: N
CHARACTER(LEN=N) :: A
PRINT '(1X,A)', "STRING RECEIVED:"
PRINT '(1X,A8, A50)', "VALUE=", A
END SUBROUTINE
.NET代码(C#2008)
[DllImport("mathlib.dll")]
static extern void TEST_STR(string A, int n);
...
string S = new string('@', 50);
TEST_STR(S, S.Length);
但是我无法进行任何更改并返回字符串(还)。也许这足以让你前进。
答案 1 :(得分:0)
您是否尝试在P / Invoke中指定<MarshalAs(UnmanagedType.LPStr)>
?
Public Declare Auto Sub YOUR_SUB Lib "YOUR_DLL.Dll" (<MarshalAs(UnmanagedType.LPStr)> YOUR_VARIABLE As String)
更多相关内容:
http://msdn.microsoft.com/en-us/library/s9ts558h%28VS.71%29.aspx
和