2

Windows 64 用の gfortran コンパイラ (Simply Fortran の下) を使用しています。テスト用の基本的な fortran dll を作成するときに、VBA で実行できず、実行時エラー 48 が発生しました: dll が見つかりません。

これが私のfortranサブルーチンコードです:

subroutine multiply(x, y, z)

!DEC$ ATTRIBUTES DLLEXPORT :: multiply
!DEC$ ATTRIBUTES ALIAS : "multiply" :: multiply

real, intent(in):: x, y
real, intent(out):: z

z = x * y

end subroutine multiply

次のように入力してライブラリを作成します: gfortran -shared -omultiply.dllmultiply.f90

と私のVBAコード(私はVBA 7.0を使用しています):

Declare Sub multiply Lib "C:\Users\Olivier\Documents\Fortran\multiply.dll" (x As Single, y As Single, ByRef z As Single)

Sub test()

Dim x As Single
Dim y As Single
Dim z As Single

x = 2
y = 3

Call multiply(x, y, z)

Cells(1, 1) = z

End Sub

この VBA コードを実行すると、このファイルは宣言に記載されている正しいファイルにあるのに、multiply.dll が見つからないと表示されます。

前もって感謝します

4

4 に答える 4

0

Long次のアプローチを使用して、Excel VBA から呼び出して、おもちゃの DLL 関数から s の2D 配列を正常に設定しました。

Fortran コード:

    Subroutine FortranDLL(Array1, dim1, dim2)
    Implicit None
    Integer :: dim1, dim2
    Integer :: Array1(1:dim1, 1:dim2)
    Integer :: i, j
    do i=1,dim1
        do j=1,dim2
            Array1(i,j)=(10*i) + j
        end do
    end do
    End Subroutine FortranDLL

Code::Blocks を使用してコンパイル:

    mingw32-gfortran.exe -Jobj\Release\ -mrtd -fno-underscoring  -Wall -DBUILD_DLL -O2     -c D:\Test2\main.f95 -o obj\Release\main.o
    mingw32-gfortran.exe -shared -Wl,--output-def=bin\Release\libTest2.def -Wl,--out-implib=bin\Release\libTest2.a -Wl,--dll  obj\Release\main.o  -o bin\Release\Test2.dll -s  

特に、コンパイル時の-mrtdandの使用に注意してください。-fno-underscoring

次に、Excel VBA は次のようになります。

    Option Explicit
    Option Base 1

    Declare Sub fortrandll Lib "D:\Test2\bin\Release\Test2.dll" _
        (ByRef Array1 As Long, ByRef rows As Long, ByRef cols As Long)

    Sub TestDLL()

        Const rows As Long = 7
        Const cols As Long = 5

        Dim Arr(1 To rows, 1 To cols) As Long

        Call fortrandll(Arr(1, 1), rows, cols)

        ActiveSheet.Range("A1").Resize(rows, cols).Value = Arr

    End Sub

配列の最初の要素は、通常の Long として DLL ByRef に渡されることに注意してください。

実用的なソリューションへの最初の指針について、ここの著者に感謝します。非常によく似たソリューションが、このcomp.lang.fortran スレッドにも表示されます。

于 2016-11-14T17:30:53.507 に答える
0

私は同じ問題を抱えていて、解決策が見つかるまで気になりました。依存関係ウォーカーを見ると、おそらくデバッグ環境から参照されている dll が欠落しています。私はそうでしたDFORTD.DLL

解決策は

  1. リリースとしてコンパイルし、すべての依存 dll が利用可能であることを確認してください
  2. または、静的ライブラリ/libs:staticパラメーターを使用してコンパイルするか、設定で指定しますFortran/Library/Debug Single-threaded

最後に、dll に不足している依存関係がないことを確認してください。

依存する

于 2014-09-16T18:41:31.323 に答える
0

私のExcel 2010は確かに32ビットバージョンなので、32ビットDLL乗算を次のようにビルドしましたSTDCALL

subroutine multiply(x, y, z)

    !GCC$ ATTRIBUTES STDCALL :: multiply

    real , intent (in) :: x, y  
    real , intent (inout) :: z  

    z = x * y

end subroutine multiply

この DLL を Dependency Walker で開くと、見つからないと表示されますLIBGCC_S_SJLJ-1.DLL。ALIAS を使用してこの問題を解決する方法がわかりません。また、VBA で実行するとランタイム エラー 53 が発生します。 Rでfortran dllをリンクするのはとても簡単でした.VBAで同じことをするのがこんなに複雑だとは想像もしていませんでした:(

于 2013-08-06T20:01:17.183 に答える
0

LoadLibrary-API を試しましたか?

Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" ( _
    ByVal lpLibFileName As String) As Long

Declare Sub multiply Lib "multiply.dll" ( _
    x As Single, _
    y As Single, _
    ByRef z As Single)

'Call LoadLibrary ONCE!!!! before calling 'multiply', e.g. on opening the workbook
LoadLibrary "C:\Users\Olivier\Documents\Fortran\multiply.dll"

よろしく、

アクダ

于 2013-08-06T10:20:01.017 に答える