ダイナミック・リンク・ライブラリー (DLL) は,複数のプロセス間でデータを共有する場所として使用できる実行形式ファイルです。
コーディング要件には,cDEC$ ATTRIBUTES DLLIMPORT および DLLEXPORT コンパイラ指示文を使用することが含まれます。プログラムと DLL 中で宣言された変数とルーチンは,DLLIMPORT と DLLEXPORT を使用しない限り,互いには見えません。
複数のスレッドまたはプロセスの間でデータを共有するには,次のようにします。
共有されるデータの順序,大きさ,およびデータ型に,DLL と,DLL がエクスポートするデータをインポートするすべての手続中で一貫性を持たせます。
複数のスレッドまたはプロセスが共通ブロックに同時に書き込みを行える場合,Windows オペレーティング・システムの適切な機能を使って,共有データの参照を制御します。Windows NT, Windows XP, Windows 2000 システムのこの種の機能には,クリティカル・セクション (シングル・プロセス,マルチスレッドでの同期) やミューテックス・オブジェクト (マルチプロセスでの同期) などがあります。
ここでは,以下のことについて説明します。
ダイナミック・リンク・ライブラリー中のデータとコードは,それを呼び出すプログラムのデータとコードと同じアドレス空間にロードされます。ただし,プログラムと DLL 中で宣言されている変数とルーチンは,cDEC$ ATTRIBUTES DLLIMPORT および DLLEXPORT コンパイラ指示文を使用しない限り,互いには見えません。これらの命令により,コンパイラとリンカーはデータとルーチンの共有が行えるようにアドレス空間の正しい部分へのマッピングを行い,複数の実行形式ファイルの共通ブロック・データを使用できるようになります。
DLLEXPORT を使うと,DLL 中の共通ブロックがプログラムや別の DLL にエクスポートされることを宣言することができます。同じように,呼び出し側のルーチン中で DLLIMPORT を使用すると,コンパイラに対して,共通ブロックがそれを定義している DLL からインポートされることを通知することができます。
共通ブロック・データのエクスポートとインポートを行う方法
!DEC$ ATTRIBUTES DLLEXPORT :: /X/ COMMON /X/ C, B, A REAL C, B, A END ...
Fortran DLL 手続が共通ブロック宣言しか含んでいない場合,BLOCK DATA 文を使用することができます。
BLOCK DATA T !DEC$ ATTRIBUTES DLLEXPORT :: /X/ COMMON /X/ C, B, A REAL C, B, A END
DLL にリンクする Fortran 手続は,次のように手続を含むことができます。
SUBROUTINE SETA(I) !DEC$ ATTRIBUTES DLLEXPORT :: SETA, /X/ COMMON /X/ C, B, A REAL C, B, A INTEGER I A = A + 1. I = I + 1 WRITE (6,*) 'In SETA subroutine, values of A and I:' , A, I RETURN END SUBROUTINE
PROGRAM COMMONX !DEC$ ATTRIBUTES DLLIMPORT:: SETA, /X/ COMMON /X/ C, B, A REAL C, B, A, Q EQUIVALENCE (A,Q) A = 0. I = 0 WRITE (6,*) 'In Main program before calling SETA...' WRITE (6,*) 'values of A and I:' , A, I CALL SETA(I) WRITE (6,*) 'In Main program after calling SETA...' WRITE (6,*) 'values of A and I:' , Q, I A = A + 1. I = I + 1 WRITE (6,*) 'In Main program after incrementing values' END PROGRAM COMMONX
「ダイナミック・リンク・ライブラリーのビルドと使用」の説明に従って,DLL をビルドし,さらに主プログラムをビルドします。
モジュール内のデータ・オブジェクトのエクスポートとインポート
モジュール内のデータ・オブジェクトに DLLEXPORT プロパティを与えると,そのオブジェクトは DLL からエクスポートされます。
モジュールが別のプログラム単位で USE 文を通して使用された場合,DLLEXPORT プロパティを持つモジュール内のすべてのオブジェクトは,そのモジュールを使用するプログラム中で,DLLIMPORT プロパティを使って宣言されたものとして扱われます。このため,DLL に含まれているモジュールを使用する主プログラムは,その DLL からエクスポートされるすべてのオブジェクトの正しいインポート属性を持っていることになります。
また,モジュール内の一部のオブジェクトに DLLIMPORT プロパティを与えることもできます。DLLIMPORT プロパティを持てるのは,INTERFACE ブロック中の手続宣言と,EXTERNAL として,または cDEC$ ATTRIBUTES EXTERN コンパイラ指示文使って宣言されたオブジェクトだけです。この場合,オブジェクトは,モジュールを使用するプログラム単位によってインポートされます。
DLL の一部であるモジュールを使用しており,DLLEXPORT または DLLIMPORT プロパティを持たないモジュールに含まれているオブジェクトを使用したときの結果は未定です。
関連情報
DLL のビルドについては,「ダイナミック・リンク・ライブラリーのビルドと使用」を参照してください。
マルチスレッド・プログラミングについては,「マルチスレッド・アプリケーションの作成」を参照してください。