1

私は、私たちが毎日使用している動作するソフトウェアパッケージからDLLを取得しているため、動作することがわかっているFortranで記述されたDLLを持っています。私は何からでもそれを呼び出そうとしていますが、正しくフォーマットされた引数を出し入れすることに問題があると信じているので、VBプログラムからアクセスすることにしました。私がVBを選んだのは、使用しているソフトウェアパッケージの開発者に連絡し、FORTRANソースを表示することを許可されていないにもかかわらず、彼がVB6で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
4

4 に答える 4

3

解決策を見つけました。VB6 では、特に指定しない引数は、デフォルトで ByRef として関数に渡されます。VB.NET では、関数宣言で引数を空白のままにすると、ByVal が自動的に挿入されるため、これが事実上のデフォルトのようです。VB.NET では言い換えると、指定が強制されるため、VB6 から VB.NET に関数宣言を行う場合は、VB6 でマークされていないデフォルトが ByRef であることを知っておいてください。

于 2010-02-01T20:09:12.193 に答える
1

はい、VB.NET のデータ型は VB6 のデータ型と互換性がありません。VB6 Integer は Short (別名 Int16) になりました。VB6 Long は Integer (別名 Int32) になりました。VB6 Boolean は変わったダックでしたが、今では値 True が -1 で False が 0 の Short と同等です。

関数宣言の Long を Integer に変更することから始めます。これが大きな問題です。

于 2010-02-01T16:37:19.680 に答える
0

場合によっては、文字列パラメーターを持つ外部関数で Auto キーワードを使用する必要があります。

Declare Auto Sub FCC_Curves Lib...
于 2010-02-02T02:53:03.557 に答える