|
我想把字符串(如“文件名”)通过vb6.0传入Fortran的动态链接库,程序可以顺利结束,但是传入的字符串没有正确地截断?
vb代码:
[Visual Basic] 纯文本查看 复制代码 01 | Private Declare Sub char_1 Lib "D:\try_vb\char_1\char_1_dll\char_1_dll\Debug\char_1_dll.dll" ( ByVal char As String ) |
04 | Private Sub Command1_Click() |
06 | char = "c:/desktop/aaa.txt" |
11 | Private Sub Command2_Click() |
Fortran代码:
[Fortran] 纯文本查看 复制代码 001 | subroutine char_ 1 ( pfilename ) |
002 | !DEC$ ATTRIBUTES stdcall,DLLEXPORT::char_1 |
003 | !DEC$ ATTRIBUTES ALIAS:"char_1"::char_1 |
004 | !DEC$ ATTRIBUTES reference :: pfilename |
008 | character ( len = 512 ) :: pfilename |
009 | character ( len = 512 ) :: filename |
012 | filename = Ctrim ( pfilename ) |
013 | open ( unit = 18 , file = "result_20170207" , status = 'replace' , action = 'write' ) |
014 | write ( 18 , * ) "This is dll" |
015 | write ( 18 , * ) filename ( 1 : ii ) |
016 | write ( 18 , * ) "the third line" |
022 | MODULE String_Functions |
038 | MODULE PROCEDURE copy_a 2 s , copy_s 2 a |
043 | PURE FUNCTION Copy_a 2 s ( a ) RESULT ( s ) |
053 | PURE FUNCTION Copy_s 2 a ( s ) RESULT ( a ) |
063 | PURE INTEGER FUNCTION Clen ( s ) |
068 | IF ( s ( i : i ) == CHAR ( 0 ) ) Clen = i -1 |
072 | PURE INTEGER FUNCTION Clen_trim ( s ) |
076 | i = LEN_TRIM ( s ) ; Clen_trim = i |
077 | IF ( s ( i : i ) == CHAR ( 0 ) ) Clen_trim = Clen ( s ) |
078 | END FUNCTION Clen_trim |
081 | FUNCTION Ctrim ( s 1 ) RESULT ( s 2 ) |
088 | INTEGER FUNCTION Count_Items ( s 1 ) |
094 | k = 0 ; IF ( s /= ' ' ) k = 1 |
095 | DO i = 1 , LEN_TRIM ( s ) -1 |
096 | IF ( s ( i : i ) /= ' ' .AND. s ( i : i ) /= ',' & |
097 | .AND. s ( i +1 : i +1 ) == ' ' .OR. s ( i +1 : i +1 ) == ',' ) k = k +1 |
100 | END FUNCTION Count_Items |
103 | FUNCTION Reduce_Blanks ( s ) RESULT ( outs ) |
108 | n = 0 ; k = LEN_TRIM ( s ) |
110 | n = n +1 ; outs ( n : n ) = s ( i : i ) |
111 | IF ( s ( i : i +1 ) == ' ' ) n = n -1 |
113 | n = n +1 ; outs ( n : n ) = s ( k : k ) |
114 | IF ( n < k ) outs ( n +1 : ) = ' ' |
115 | END FUNCTION Reduce_Blanks |
118 | FUNCTION Replace_Text ( s , text , rep ) RESULT ( outs ) |
123 | outs = s ; nt = LEN_TRIM ( text ) ; nr = LEN_TRIM ( rep ) |
125 | i = INDEX ( outs , text ( : nt ) ) ; IF ( i == 0 ) EXIT |
126 | outs = outs ( : i -1 ) / / rep ( : nr ) / / outs ( i + nt : ) |
128 | END FUNCTION Replace_Text |
131 | FUNCTION Spack ( s , ex ) RESULT ( outs ) |
137 | n = 0 ; aex = Copy ( ex ) |
139 | IF ( .NOT. ANY ( s ( i : i ) == aex ) ) CYCLE |
140 | n = n +1 ; outs ( n : n ) = s ( i : i ) |
146 | INTEGER FUNCTION Tally ( s , text ) |
150 | Tally = 0 ; nt = LEN_TRIM ( text ) |
152 | IF ( s ( i : i + nt -1 ) == text ( : nt ) ) Tally = Tally +1 |
157 | FUNCTION Translate ( s 1 , codes ) RESULT ( s 2 ) |
165 | j = INDEX ( codes ( 1 ) , ch ) ; IF ( j > 0 ) ch = codes ( 2 ) ( j : j ) |
168 | END FUNCTION Translate |
171 | FUNCTION Upper ( s 1 ) RESULT ( s 2 ) |
175 | INTEGER , PARAMETER :: DUC = ICHAR ( 'A' ) - ICHAR ( 'a' ) |
180 | IF ( ch >= 'a' .AND. ch <= 'z' ) ch = CHAR ( ICHAR ( ch ) + DUC ) |
186 | FUNCTION Lower ( s 1 ) RESULT ( s 2 ) |
190 | INTEGER , PARAMETER :: DUC = ICHAR ( 'A' ) - ICHAR ( 'a' ) |
195 | IF ( ch >= 'A' .AND. ch <= 'Z' ) ch = CHAR ( ICHAR ( ch ) - DUC ) |
200 | END MODULE String_Functions |
运行后,输出的结果如下:
关于一些回复请看:http://stackoverflow.com/questio ... r-and-read-sentence
我用的“String_Functions”就是根据其中的方法做的,但是似乎不行?
另外弱弱地问一句:在vb里,怎么调试dll呢?(我看网上的方法要加入dll的工程,但是我的dll是ivf下的工程,加不进来啊)..
|
-
aa.jpg
(31.66 KB, 下载次数: 356)
结果图片
|