USEROPEN 指定子は,ファイルの開き方を制御するユーザー作成の外部関数を指定します。ファイルは,引き続き発生する Fortran I/O 文の効果を変更する特別な文脈を確立するために,システム・コールやライブラリー・ルーチンを使うことができます。これは次の形式を取ります。
USEROPEN = function-name
function-name
制御を受け取るユーザー作成の関数名。
Visual Fortran 実行時ライブラリー (RTL) の I/O サポート・ルーチンは,ファイルが最初に I/O のために開かれた時に通常使われるシステム・コールの代わりに USEROPEN で指定された関数を呼び出します。WIN32 プラットフォームでは,Fortran RTL は通常 CreateFile() でファイルを開きます。
呼び出された関数は,CreateFile() を使ってファイル (またはパイプなど) を開き,Visual Fortran プログラムの呼び出し元に制御が戻る時にファイルの handle (CreateFile() から戻される値) を返さなければなりません。ファイルを開く時,呼び出された関数は一般的に通常の Fortran OPEN 文で提供されるものとは異なったオプションを指定します。
USEROPEN で指定する関数の主目的は,CreateFile() WIN32 API に対する呼び出しのジャケットです。関数は,Fortran,C,またはその他の言語で書くことができます。関数が Fortran で書かれた場合,USEROPEN で指定したファイルを開くために Fortran OPEN 文を実行してはいけません。
例
Fortran プログラムの呼び出し側では,USEROPEN で指定した関数をまず EXTERNAL 文で宣言しなければなりません。たとえば,USEROPEN 手続 UOPEN を呼び出すために次の Fortran プログラムを使います。
IMPLICIT INTEGER (A-Z) EXTERNAL UOPEN ... OPEN(UNIT=10,FILE='UOPEN.DAT',STATUS='NEW',USEROPEN=UOPEN)
OPEN 文が実行されると,UOPEN 関数が制御を受け取ります。関数は,CreateFile() を呼び出してファイルを開き,指定された操作を実行し,呼び出し元の Fortran プログラムに制御を (CreateFile() が返す handle とともに) 返します。
UOPEN 関数がどのようなものかを次に示します。
INTEGER FUNCTION UOPEN( FILENAME, & DESIRED_ACCESS, & SHARE_MODE, & A_NULL, & CREATE_DISP, & FLAGS_ATTR, & B_NULL, & UNIT, & FLEN ) !DEC$ ATTRIBUTES C, ALIAS:'_UOPEN' :: UOPEN !DEC$ ATTRIBUTES REFERENCE :: DESIRED_ACCESS !DEC$ ATTRIBUTES REFERENCE :: SHARE_MODE !DEC$ ATTRIBUTES REFERENCE :: CREATE_DISP !DEC$ ATTRIBUTES REFERENCE :: FLAGS_ATTR !DEC$ ATTRIBUTES REFERENCE :: UNIT USE DFWIN IMPLICIT INTEGER (A-Z) CHARACTER*(FLEN) FILENAME TYPE(T_SECURITY_ATTRIBUTES), POINTER :: NULL_SEC_ATTR ! CreateFile() にフラグ属性の FILE_FLAG_WRITE_THROUGH ビットを設定します。 FLAGS_ATTR = FLAGS_ATTR + FILE_FLAG_WRITE_THROUGH ! CreateFile() を呼び出し,Fortran RTL に状態を返します。 STS = CreateFile( FILENAME, & DESIRED_ACCESS, & SHARE_MODE, & NULL_SEC_ATTR, & CREATE_DISP, & FLAGS_ATTR, & 0 ) UOPEN = STS RETURN END
UOPEN 関数は,cdecl 呼び出し規約を使うために宣言されています。そのため,USEROPEN ルーチンの Fortran RTL 宣言と一致しています。
以下の関数定義と引数は,Visual Fortrn RTL から USEROPEN で指定された関数に渡されます。
INTEGER FUNCTION UOPEN( FILENAME, & DESIRED_ACCESS, & SHARE_MODE, & A_NULL, & CREATE_DISP, & FLAGS_ATTR, & B_NULL, & UNIT, & FLEN ) !DEC$ ATTRIBUTES C, ALIAS:'_UOPEN' :: UOPEN !DEC$ ATTRIBUTES REFERENCE :: DESIRED_ACCESS !DEC$ ATTRIBUTES REFERENCE :: SHARE_MODE !DEC$ ATTRIBUTES REFERENCE :: CREATE_DISP !DEC$ ATTRIBUTES REFERENCE :: FLAGS_ATTR !DEC$ ATTRIBUTES REFERENCE :: UNIT
最初の 7 つの引数は CreateFile() API 引数に対応します。これらの引数の値は,呼び出し側の OPEN 文の引数に対応して設定されます。
最後の 2 つの引数は,Fortran 装置番号とファイル名の長さです。