2010-02-01 4 views
1

우리가 매일 사용하는 작업 소프트웨어 패키지에서 얻은 DLL 때문에 fortran에 DLL이 작성되었습니다. 나는 그것을 무엇이든 부르려고 노력하고 있지만 올바르게 형식화 된 인수를 전달하는 것으로 믿는 문제가 있으므로 VB 프로그램에서 액세스하려고 시도했다. 내가 사용하고있는 소프트웨어 패키지의 개발자에게 연락했기 때문에 나는 VB를 선택했다. 그리고 그는 나에게 FORTRAN 소스를 보여줄 수는 없지만 VB6에서 DLL 함수 호출을 주었다.VB.NET에서 FORTRAN DLL에 인수를 전달할 때 문제가 발생하는 이유

VB6 이외의 다른 데이터 형식을 사용하는 VB.NET에서 작성한 문제가 (아마도 생각합니다). 아무도 내가 왜 문제가 있는지 볼 수 있습니까?

실행 중에 오류가 발생했습니다 : "AccessViolationException 처리되지 않았습니다 : 보호 된 메모리를 읽거나 쓰려고했습니다. 이것은 종종 다른 메모리가 손상되었음을 나타냅니다." 여기

Declare Sub FCC_Curves Lib "FCC_Curves.dll" (Read_Flag As Boolean, First_Flag As Boolean, Frequency_MHz As Single, IQT As Integer, ByVal Radiation_Opt As String, ByVal L1 As Long, ERP_Watts As Single, T_PowerWatts As Single, Tx_GaindBi As Single, T_Loss As Single, ByVal Service As String, ByVal L2 As Long, Reliability As Integer, ByVal FCC_CurvesDataPath As String, ByVal L3 As Long, ByVal TerrainRoughness As String, ByVal L4 As Long, Haatm As Single, NPRfl As Integer, NFCCCurve As Integer, HPRfl As Single, Crve As Single, FCC_Loss As Single, Code As Integer, FS As Single) 

내 코드는 다음과 같습니다 : 여기

내가 함께 제공된 함수 호출

Module Module1 

    Declare Sub FCC_Curves Lib "FCC_Curves.dll" (ByVal Read_Flag As Boolean, ByVal First_Flag As Boolean, ByVal Frequency_MHz As Single, ByVal IQT As Int16, ByVal Radiation_Opt As String, ByVal L1 As Int32, ByVal ERP_Watts As Single, ByVal T_PowerWatts As Single, ByVal Tx_GaindBi As Single, ByVal T_Loss As Single, ByVal Service As String, ByVal L2 As Int32, ByVal Reliability As Int16, ByVal FCC_CurvesDataPath As String, ByVal L3 As Int32, ByVal TerrainRoughness As String, ByVal L4 As Int32, ByVal Haatm As Single, ByVal NPRfl As Int16, ByVal NFCCCurve As Int16, ByVal HPRfl() As Single, ByVal Crve() As Single, ByRef FCC_Loss As Single, ByRef Code As Int16, ByRef FS() As Single) 


    Sub Main() 

     Dim Read_Flag As Boolean 
     Dim First_Flag As Boolean 
     Dim Frequency_MHz As Single 
     Dim IQT As Int16 
     Dim Radiation_Opt As String 
     Dim L1 As Int32 
     Dim ERP_Watts As Single 
     Dim T_PowerWatts As Single 
     Dim Tx_GaindBi As Single 
     Dim T_Loss As Single 
     Dim Service As String 
     Dim L2 As Int32 
     Dim Reliability As Int16 
     Dim FCC_CurvesDataPath As String 
     Dim L3 As Int32 
     Dim TerrainRoughness As String 
     Dim L4 As Int32 
     Dim Haatm As Single 
     Dim NPRfl As Int16 
     Dim NFCCCurve As Int16 
     Dim HPRfl(12) As Single 
     Dim Crve(5) As Single 
     Dim FCC_Loss As Single 
     Dim Code As Int16 
     Dim FS(15) As Single 
     'Dim HPRfl As Single 
     'Dim Crve As Single 
     'Dim FCC_Loss As Single 
     'Dim Code As Int16 
     'Dim FS As Single 

     Read_Flag = True 
     First_Flag = True 
     Frequency_MHz = 98.1 
     IQT = 0 
     Radiation_Opt = "ERP" 
     L1 = 3 
     ERP_Watts = 1000 
     T_PowerWatts = 1000 
     Tx_GaindBi = 2.15 
     T_Loss = 0 
     Service = "Broadcast" 
     L2 = 9 
     Reliability = 50 
     FCC_CurvesDataPath = "C:\Program Files\CSPT_Extension\data\" 
     L3 = 37 
     TerrainRoughness = "Off" 
     L4 = 3 
     Haatm = 1500 
     NPRfl = 13 
     NFCCCurve = 6 
     Dim i As Int16 
     HPRfl(0) = 11 
     HPRfl(1) = 128 
     For i = 2 To 12 
      HPRfl(i) = 1500 
     Next 
     For i = 0 To 5 
      Crve(i) = i * 15 
     Next 



     FCC_Curves(Read_Flag, First_Flag, Frequency_MHz, IQT, Radiation_Opt, L1, ERP_Watts, T_PowerWatts, Tx_GaindBi, T_Loss, Service, L2, Reliability, FCC_CurvesDataPath, L3, TerrainRoughness, L4, Haatm, NPRfl, NFCCCurve, HPRfl, Crve, FCC_Loss, Code, FS) 

    End Sub 

End Module 

답변

1

예, VB.NET 데이터 유형이 VB6 것들과 호환되지 않습니다. VB6 Integer는 이제 Short (일명 Int16)입니다. VB6 Long은 이제 정수 (일명 Int32)입니다. VB6 Boolean은 이상한 오리였습니다. 이제는 Short에 해당하는 값은 True이고 -1은 False입니다.

함수 선언에서 Long을 Integer로 변경하면 큰 것입니다.

+0

+1. 맞아, 나를 때려! – MarkJ

3

해결책을 찾았습니다. VB6에서는 달리 지정하지 않는 인수는 기본적으로 ByRef로 함수에 전달됩니다. VB.NET에서는 함수 선언에 인수를 비워두면 자동으로 ByVal이 삽입되므로 defacto 기본값으로 간주됩니다. VB.NET에서는 다른 말로 지정하도록 강요하므로 VB6에서 VB.NET으로의 함수 선언을 수행하는 경우 VB6에서 표시되지 않은 기본값은 ByRef입니다.

0

때때로 문자열 매개 변수가있는 외부 함수에서 Auto 키워드를 사용해야합니다.

Declare Auto Sub FCC_Curves Lib... 
관련 문제