インテル® Fortran コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
ここでは、インテル® Visual Fortran アプリケーションによる Windows* API ルーチンの呼び出しに関する一般情報を説明します。説明する内容は次のとおりです。
インテル® Visual Fortran インターフェイス定義をインクルードした後で、適切な Windows* API ルーチンを呼び出すには、次のガイドラインに従ってください。
Windows* API の適切なルーチン (例: GetSystemTime) に関するドキュメントで、次の情報を確認します。
引数の数および順序。適切なデータ型を使用して各可変長引数を宣言し、初期化する必要があります。GetSystemTime ルーチンの場合、structure (派生型) は参照によって渡されます。
文字引数があれば、Windows* API ルーチンを呼び出す前に、終端文字として NULL 文字を追加します。
ルーチンが結果を返すかどうか (返す場合は関数、返さない場合はサブルーチン)。例えば、GetSystemTime ルーチンの呼び出し形式は VOID のため、このルーチンは CALL 文を使用して、サブルーチンとして呼び出す必要があります。
引数のデータ型または関数の戻り値が分からない場合、...\INCLUDE\ ディレクトリー以下の適切な .F90 ファイルからインターフェイス定義を確認することができます。例えば、GetSystemTime のインターフェイス定義を参照するには、次のように操作します。
テキストエディター (メモ帳など) で ...\INCLUDE\ ディレクトリーの kernel32.f90 ファイルを開きます。
ルーチン名 (GetSystemTime など) を検索します。
インターフェイス定義と Windows* API ドキュメントの Fortran で表現されている引数とを比較します。引数の渡し方に注意してください。場合によっては (任意のデータ型がアドレスによって渡される場合など)、直接変数を渡すのではなく、LOC 組込み関数を使用して、変数のアドレスを渡さなければなりません。
引数の 1 つが構造体の場合、...\INCLUDE\ ディレクトリー以下の IFWINTY.F90 ファイルから定義を参照してください。例えば、GetSystemTime で使用する T_SYSTEMTIME データ型の定義を参照するには、次のように操作します。
テキストエディター (メモ帳など) で ...\INCLUDE\ ディレクトリーの IFWINTY.F90 ファイルを開きます。
データ型名 (T_SYSTEMTIME など) を検索します。
データ型の定義のフィールド名に注意してください。場合によっては、Windows* API ドキュメントにリストされた定義とは多少異なることがあります。
変数名を定義して、プログラム内で派生型の定義を使用します。次に例を示します。
TYPE (T_SYSTEMTIME) MYTIME
多くの Windows* API ルーチンには、"handle" と呼ばれる引数または戻り値があります。一般に、これはアドレスサイズの整数で、適切な KIND 値 (通常は、32 ビット/64 ビット・プラットフォームの正しい値を提供する HANDLE) で宣言されていなければなりません。次に例を示します。
Integer(HANDLE) :: hwnd
変数の定義を利用して、Win32 ルーチンを呼び出します。完成したプログラムの例を次に示します。
! Getsystime.f90 file: Windows* API ルーチンの呼び出し方法を示します。
! 呼び出されるルーチンは GetSystemTime だけなので、ifwin.f90 で
! インクルードされるすべてのモジュールの代わりに、kernel32.mod の
! インターフェイス定義のみインクルードします。KERNEL32 内で
! 使用される型定義は IFWINTY で定義されます。
PROGRAM Getsystime
USE KERNEL32
TYPE (T_SYSTEMTIME) MYTIME
CALL GetSystemTime(MYTIME)
WRITE (*,*) 'Current UTC time hour and minute:', Mytime.wHour, Mytime.Wminute
END PROGRAM
新規の Fortran コンソール (または QuickWin) アプリケーション・プロジェクトを作成し、上記のコードをソースファイルとして追加およびビルドして、結果を表示することができます。
IFWIN およびその他の Win32 API モジュールで使用される IFWINTY モジュールは、Windows* の WINDOWS.H ヘッダーファイルで提供される多くの型定義に対応する INTEGER および REAL 種別の定数を定義します。INTEGER 宣言および REAL 宣言で、これらの種別の値を使用します。次の表は、一般的な Windows* の型と対応するデータ型を示しています。
Windows* データ型 |
対応する Fortran データ型 |
---|---|
BOOL、BOOLEAN |
INTEGER(BOOL) |
BYTE |
INTEGER(BYTE) |
CHAR、CCHAR、UCHAR |
CHARACTER または INTEGER(UCHAR) |
DWORD |
INTEGER(DWORD) |
ULONG |
INTEGER(ULONG) |
SHORT |
INTEGER(SHORT) |
LPHANDLE |
INTEGER(LPHANDLE) |
PLONG |
INTEGER(PLONG) |
DOUBLE |
REAL(DOUBLE) |
明示的に種別を数値として指定したり、デフォルトの種別を仮定する代わりに、これらの定数を使用してください。
Windows* の BOOL 型は、Fortran の LOGICAL と同等ではありません。Fortran の LOGICAL 演算子およびリテラル定数とともに使用しないでください。Fortran のリテラルの .TRUE. および .FALSE. ではなく、IFWINTY で定義した定数の TRUE および FALSE を使用してください。また、LOGICAL 式を使用して、BOOL 値をテストしないでください。
対応する引数のデータ型に関する注意事項:
引数が Windows* API ドキュメントでポインターとして説明されている場合、それに対応する Fortran インターフェイス定義には REFERENCE プロパティーがあります (ATTRIBUTES を参照)。古いインターフェイス定義では、POINTER - Integer 型が使用され、引数のアドレスまたは LOC 組込み関数を渡します。
IA-32 アーキテクチャー・ベースのシステムでは、ポインター引数は 32 ビット (4 バイト) 長です。インテル® 64 アーキテクチャー・ベースのシステムでは、ポインター引数は 64 ビット (8 バイト) 長です。
Fortran 文字変数は、NULL 文字で終了する必要があります。これは、C の文字列拡張を使用して行うことができます (「C Strings in Character Constants」を参照)。
forstring = 'This is a null-terminated string.'C
ISO_C_BINDING, or CHAR(0) 組込みモジュールの C_NULL_CHAR 定数を使用して NULL 文字を結合することもできます。
use, intrinsic :: ISO_C_BINDING
…
forstring = 'This is a null-terminated string'//C_NULL_CHAR
forstring2 = 'This is another null-terminated string'//CHAR(0)
WINDOWS.H 内の構造体は、IFWINTY の構造型に変換されました。構造体の中の共用体は、派生型の中で共用体/マップに変換されます。
一般的に、コンポーネントの名前は変更されません。C の bitfield 型は、Fortran へ直接変換されません。bitfield 型のコレクションは、Fortran の INTERGER 型として宣言され、個々の bitfield 型は、ソース (IFWINTY.F90) 内でコメントとして記述されます。特定の Windows* の宣言がどのように Fortran へ変換されるか確認するには、Include フォルダーにある適切な .F90 ソースファイルで対応する宣言を参照してください。