USEROPEN 指定子

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 文の引数に対応して設定されます。

FILENAME
ファイルの名前を示すヌルで終わる文字列のアドレス。
DESIRED_ACCESS
参照で渡される希望する参照 (読み書き) モード。
SHARE_MODE
参照で渡されるファイル共有モード。
A_NULL
常にヌル。Fortran RTL は常に CreateFile() 呼び出しでの SECURITY_ATTRIBUTES 構造体へのポインタとしてヌルを渡します。
CREATE_DISP
ファイルが存在した時にどのような動作を取るかとファイルが存在しない時にどのような動作を取るかを指定する作成処置。参照で渡されます。
FLAGS_ATTR
ファイルのファイル属性とフラグを指定。参照で渡されます。
B_NULL
常にヌル。Fortran RTL は常に CreateFile() 呼び出しでのテンプレート・ファイルの handle としてヌルを渡します。

最後の 2 つの引数は,Fortran 装置番号とファイル名の長さです。

UNIT
この OPEN が行われる Fortran 装置番号。参照で渡されます。
FLEN
ファイル名の長さ。最後のヌルは含まれません。値で渡されます。