Как передать строку из Visual Basic 2010 в библиотеку Fortran DLL? - PullRequest
1 голос
/ 03 августа 2011

Я могу без проблем передавать целые, одинарные, двойные и массивы всего этого взад и вперед.Но я не могу понять, как передать строку в Visual Basic 2010 в символьную переменную в Fortran DLL.Я продолжаю получать ошибку PInvokeStackImbalance.Я мог бы просто преобразовать строку Visual Basic в целочисленный массив, содержащий код ASCII для каждого символа, отправить его и преобразовать обратно в DLL, но это жалко.Должен быть простой способ сделать это.

Сначала я попытался использовать Dim txt(50) as Char в VB2010 и character*50 txt в DLL DVF F90, но это не сработало.

Затем япопробовал Dim txt as String в Visual Basic 2010 и сделал строку длиной 50 символов (также пробовал 49), но это не сработало.

Я надеюсь, что кто-то еще хочет передать имена файлов и тому подобное ихDLL.

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Ну, я сделал это с C #, и это было просто:

КОД ФОРТРАНА (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 Code (C # 2008)

[DllImport("mathlib.dll")]
static extern void TEST_STR(string A, int n);
...
string S = new string('@', 50);
TEST_STR(S, S.Length);

Но я не могу внести никаких изменений и вернуть строку (пока). Может быть, этого достаточно, чтобы вы пошли.

0 голосов
/ 03 августа 2011

Вы пытались указать <MarshalAs(UnmanagedType.LPStr)> в P / Invoke?

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

и

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute%28VS.80%29.aspx

...