DLL 中の手続を共有するためのコーディング要件

ダイナミック・リンク・ライブラリー (DLL) は,それらを使用するアプリケーションとは別にコンパイル,リンク,格納された 1 つまたは複数のサブプログラムを含んでいます。

コーディング要件には,cDEC$ ATTRIBUTES DLLIMPORT および DLLEXPORT コンパイラ指示文を使用することが含まれます。主プログラムと DLL 中で宣言された変数とルーチンは,DLLIMPORTDLLEXPORT を使用しない限り,互いには見えません。

この節では,Fortran DLL 中の副プログラム手続 (関数とサブルーチン) の共有に関して説明します。

個々の DLL 副プログラムのエクスポートとインポートを行う方法

  1. Fortran DLL 中で,DLL 外で使用される個々の副プログラムをエクスポートします。関数,サブルーチン,またはデータが,DLL 外にエクスポートされることを宣言する cDEC$ ATTRIBUTES DLLEXPORT コンパイラ指示文を追加します。次に例を示します。
    	SUBROUTINE ARRAYTEST(arr)
    	!DEC$ ATTRIBUTES DLLEXPORT :: ARRAYTEST
    	   REAL(4) arr(3, 7)
    	   INTEGER i, j
    	   DO i = 1, 3
    	      DO j = 1, 7
    	         arr (i, j) = 11.0 * i + j
    	      END DO
    	   END DO
    	END SUBROUTINE
    
  2. Fortran アプリケーション中で,個々の DLL 副プログラムをインポートします。関数,サブルーチン,またはデータを,現在の実行形式ファイル外からインポートすることを宣言する cDEC$ ATTRIBUTES DLLIMPORT コンパイラ指示文を追加します。次に例を示します。
    	INTERFACE
    	   SUBROUTINE ARRAYTEST (rarray)
    	   !DEC$ ATTRIBUTES DLLIMPORT :: ARRAYTEST
    	      REAL rarray(3, 7)
    	   END SUBROUTINE ARRAYTEST
    	END INTERFACE
    

    DLLEXPORT および DLLIMPORT オプション (cDEC$ ATTRIBUTES コンパイラ指示文) は DLL のインタフェースを定義します。

    DLLEXPORT プロパティは,関数またはデータが他の実行形式ファイルまたは DLL にエクスポートされることを宣言し,通常は,DLLEXPORT で宣言された関数またはサブルーチンのシンボルを,リンカー・モジュール定義 (.DEF) ファイルなしでもエクスポートできるようにします。DLLEXPORT プロパティを持つ関数,サブルーチン,またはデータを宣言するときには,同じプログラムの同じモジュール中で定義が行われている必要があります。

    別の実行形式ファイル (.DLL など) に定義されているシンボルを使用するプログラムは,それらのシンボルをインポートしなくてはなりません。DLL ユーザーは,別実行形式ファイルのインポート .LIB ファイルとリンクして,シンボルをインポートするアプリケーション中で DLLIMPORT オプションを使用する必要があります。DLLIMPORT オプションは定義ではなく宣言中で使用します。これは,インポートするシンボルについては定義は行わないからです。

  3. ダイナミック・リンク・ライブラリーのビルドと使用」の説明に従って,DLL をビルドし,次に主プログラムをビルドします。

Fortran アプリケーションと C アプリケーションは,呼び出し規約に一貫性がある限り,Fortran と C の DLL を呼び出すことができます (「言語が混在したプログラミング」の「Visual Fortran と Visual C++ が混在したプログラミング」を参照)。

Visual Basic アプリケーションも,DLL の形になっている Fortran の関数とサブルーチンを呼び出すことができます (「言語が混在したプログラミング」の「Visual Basic からの Visual Fortran の呼び出し」を参照)。

関連情報