2017-02-07 3 views
1

При попытке отправить символ в DLL это кажется неправильным (показано в «result_20170207»). Ниже код о DLL:Fortran DLL в vb6: ошибка о «символе» и «чтении предложения»

subroutine char_1(pfilename) 
!DEC$ ATTRIBUTES stdcall,DLLEXPORT::char_1 
!DEC$ ATTRIBUTES ALIAS:"char_1"::char_1 
!DEC$ ATTRIBUTES reference :: pfilename 

character(len=512)::pfilename 
!integer::i  !(about ERROR TWO) 
write(*,*)trim(pfilename) 
!read(*,*)i  !(about ERROR TWO) 
open(unit=18,file="result_20170207",status='replace',action='write') 
    write(18,*)"This is dll" 
    write(18,*)trim(pfilename) 
    write(18,*)"the third line" 
close(18) 
end subroutine 

Ниже код в VB6.0:

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) 

Private Sub Command1_Click() 
    Dim char As String 
    char = "c:/desktop/aaa.txt" 
    Text1.Text = char 
    Call char_1(char) 
End Sub 

Private Sub Command2_Click() 
    End 
End Sub 

ОШИБКА ONE: произошло Ошибка в файле результатов является: wrong result

Я думаю, это из-за характера. Почему это происходит и как я могу это исправить? Спасибо!

ОШИБКА ВТОРАЯ: Кстати, когда я добавить код «чтения (,) я», еще одна ошибка met.Shown ниже: severe(39) коды я добавляю показаны в коде, которые закомментированные : Я озадачен двумя проблемами.

Согласно ответу MarkJ, я есть изменить свой DLL код, как показано ниже (ERROR ONE; код в "модуле String_Functions" опущено здесь):

subroutine char_1(pfilename) 
    !DEC$ ATTRIBUTES stdcall,DLLEXPORT::char_1 
    !DEC$ ATTRIBUTES ALIAS:"char_1"::char_1 
    !DEC$ ATTRIBUTES reference :: pfilename 

    use String_Functions  !--------here--------! 

    character(len=512)::pfilename 
    character(len=512)::filename 
    integer::ii  
    ii=Clen(pfilename)  !--------here--------! 
    filename=Ctrim(pfilename)  !--------here--------! 
    open(unit=18,file="result_20170207",status='replace',action='write') 
    write(18,*)"This is dll" 
    write(18,*)filename(1:ii)  !--------here--------! 
    write(18,*)"the third line" 
    close(18) 

end subroutine 
+1

Я не понимаю ваши фотографии. Что они показывают? У вас есть сообщения об ошибках, которые вы можете показать в виде текста? –

+0

Извините, что не прояснили. Ниже приведены дополнительные пояснения: –

+0

Я нажимаю «Ввод», и комментарий был отправлен. Поэтому я добавляю оставшиеся ниже: (1) ОШИБКА ОДИН: это не «ошибка», потому что она может нормально завершаться. Но в результирующем файле «result_20170207» не сохраняется правильный символ (т. Е. Строка 2 в файле результатов является либерской). Почему строка 2 не может храниться правильно (например, строка 1 «Это DLL» и строка 3 «третья строка»)? (2) ОШИБКА ДВА: это ошибка, и это время выполнения, поэтому все сообщения об ошибке - это изображение «серьезное (39)», которое указывает, что строка 11 «read (*, *) i» неверна. Мне было интересно, почему это предложение может быть неправильным. –

ответ

0

Об ошибке (1) VB6 является sending a null-terminated string. Строка содержит нулевой символ ASCII, который указывает конец строки. Fortran TRIM недостаточно, чтобы удалить этот символ. Попробуйте приведенную ниже процедуру CTRIM.

! ------------------------ 
PURE INTEGER FUNCTION Clen_trim(s) ! returns same result as LEN_TRIM unless: 
CHARACTER(*),INTENT(IN) :: s  ! last char non-blank is null, if true: 
INTEGER :: i      ! then len of C string is returned, note: 
            ! Ctrim is only user of this function 
i = INDEX(s, CHAR(0)) 
IF (i == 0) i = LEN_TRIM(s) 
Clen_trim = i 

END FUNCTION Clen_trim 

! ---------------- 
FUNCTION Ctrim(s1) RESULT(s2)  ! returns same result as TRIM unless: 
CHARACTER(*),INTENT(IN) :: s1  ! last non-blank char is null in which 
CHARACTER(Clen_trim(s1)) :: s2  ! case trailing blanks prior to null 
s2 = s1       ! are output 
END FUNCTION Ctrim 
+0

Thx! Но, похоже, это не работает. Я добавляю «MODULE String_Functions» в DLL, код указан ниже: 'subroutine char_1 (pfilename) ... use String_Functions character (len = 512) :: pfilename character (len = 512) :: Имя файла целое :: II II = Clen (pfilename) имя_файла = Ctrim (pfilename) открытым (единица = 18, файл = "result_20170207", статус = 'заменить', действие = 'записи') записи (18, *) «Это dll» write (18, *) filename (1: ii) написать (18, *) «третья строка» закрыть (18) end подпрограмма' Файл результатов «строка 2» по-прежнему giberish. В ожидании вашего ответа.^_^ –

+0

Прохладный !! Оно работает!! –