WIN32 ルーチンの呼び出し

この節は,Visual Fortran アプリケーションからの Win32 ルーチンの呼び出しに関する一般的な情報を提供しています。以下のトピックがあります。

Visual Fortran と Win32 ルーチンの比較

Visual Fortran は,Fortran 95 標準に準拠する Fortran 95/90 言語要素 (たとえば,組込み手続や文) を提供しています。また,Visual Fortran は,ライブラリー・ルーチンを含む言語拡張の言語要素も提供しています。

Visual Fortran が提供するライブラリー・ルーチンは以下のとおりです。

対照的に,Windows オペレーティング・システムが提供する Win32 Application Programming Interface (API) ルーチンは以下のとおりです。

Win32 ルーチンには幾つかのグループがあります (『Platform SDK』と 参考資料を参照)。Win32 ルーチンは,洗練されたウィンドウ管理,メモリー管理,グラフィックス・サポート,スレッド,セキュリティ,およびネットワークを提供しています。

Fortran アプリケーションから Win32 ルーチンを参照することができます。これには,Fortran Console と Fortran QuickWin アプリケーションも含まれます。Fotran Windows アプリケーション・プロジェクト・タイプのみが,GUI アプリケーションを作成するために必要な Win32 ルーチンの完全な組を参照することができます。

Fortran Console アプリケーションは,テキストのみのアプリケーションです。Fortran QuickWin アプリケーションは,Windows 形式のアプリケーションを簡単に作成することができますが,利用可能な Win32 API 機能の内の小さなサブセットのみを参照することができます。(Fortran QuickWin アプリケーションは,グラフィックスを使うこともできます。) Fortran QuickWin と Fortran Windows アプリケーションの違いは,「QuickWin アプリケーションと Windows を基本としたアプリケーションの比較」を参照してください。

Win32 ルーチンのための Visual Fortran インタフェース定義のインクルード

Visual Fortran は,Visual Fortran ライブラリー・ルーチンと Win32 API ルーチンのほぼ全部の両方のインタフェース定義を標準インクルード・ディレクトリに提供しています。

	...\DF98\INCLUDE\

Win32 インタフェース定義をインクルードするには,以下の 1 つを行います。

  1. 全ての Win32 API ルーチン定義をインクルードするには,USE DFWIN 文を追加します。

    USE DFWIN 文は,多くの Windows ルーチンの全てのパラメタとインタフェースを Visual Fortran プログラムで利用可能にします。Windows 機能を使用するプログラムや副プログラムは,USE DFWIN 文をインクルードします。これにより,各副プログラムがグラフィックスの呼び出しを行うことができるようになります。

    宣言文 (たとえば,IMPLICIT NONE または INTEGER) または宣言文を含む他のモジュールの前に USE 文を追加します。

  2. コンパイル時間を早くするために Windows アプリケーションのパラメタとインタフェースの型を制限することができます。これを行うには,複数の USE 文で必要な Win32 API のサブセットのみをインクルードします (ファイル ...\DF98\INCLUDE\DFWIN.F90 を参照)。

    呼び出すルーチン特有のライブラリーを特定するには,『Platform SDK』ドキュメントのルーチン・ページの下部の QuickInfo を参照します。ここにインポート・ライブラリー名が一覧表示されています。たとえば,GetSystemTime のみを呼び出すには,kernel32.mod (2 進形式) で提供されるインタフェース定義が必要になります。これを行うには,以下の USE 文を追加します。

    	USE KERNEL32
    

    さらにコンパイル時間を短くしたい場合,USE 文に ONLY キーワードを追加します。以下のようにします。

    	USE KERNEL32, only: GetSystemTime, GetLastError
    

Visual Fortran インタフェース定義を使った Win32 ルーチンの呼び出し

Visual Fortran インタフェース定義をインクルードした後,適切な Win32 ルーチンを呼び出すには,以下のガイドラインに従います。

  1. 『Platform SDK』の適切なルーチン (たとえば,GetSystemTime) のドキュメントを読み,以下の情報を得ます。

  2. 引数のデータ型や関数の返し値がわからない場合,...\DF98\INCLUDE\ にある適切な .F90 ファイルのインタフェース定義で確かめてください。たとえば,GetSystemTime のインタフェース定義を表示するには,以下のようにします。

    1. テキスト・エディタ (メモ帳など) で,...\DF98\INCLUDE\ にある kernel32.f90 ファイルを開きます。

    2. ルーチン名 (たとえば,GetSystemTime) を検索します。

    3. インタフェース定義を表示し,その部分をテキスト・エディタ画面のソース・ファイルにカット・アンド・ペーストします。

  3. 引数の 1 つが構造体である場合,...\DF98\INCLUDE\DFWINTY.F90 の定義を参照します。たとえば,GetSystemTime で使われる T_SYSTEMTIME 型のデータ型定義を見るには,以下のようにします。

    1. テキスト・エディタ (メモ帳など) で,...\DF98\INCLUDE\ にある DFWINTY.F90 を開きます。

    2. データ型名 (たとえば,T_SYSTEMTIME) を検索します。

    3. データ型定義を表示し,その部分をテキスト・エディタ画面のソース・ファイルにカット・アンド・ペーストします。定義された欄名は後で使用されることに注意してください。

    4. プログラムで構造型定義を使って変数名を定義します。以下のようにします。
      	TYPE (T_SYSTEMTIME) MYTIME
      
    5. Win32 ルーチンを呼び出すために変数定義を使用します。たとえば,完全なプログラムは以下のようになります。
      	! Getsystime.f90 file, shows how to call a Win32 routine
      	!
      	! Since the only routine called is GetSystemTime, only include
      	! interface definitions from kernel32.mod instead of all modules
      	! included by dfwin.f90. Type definitions are defined in DFWINTY,
      	! which is used within KERNEL32.
      
      	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 Console (または QuickWin) アプリケーションの新しいプロジェクトを作成し,上記のコードをソース・ファイルに追加し,ビルドし,結果を参照します。

特定の QuickWin と Win32 グラフィックス・ルーチンの特別な名付け規約

多くの QuickWin ルーチンは,等価な Win32 オペレーティング・システム・ルーチンと区別するために名前の後に QQ が付けられています。しかしながら,QuickWin グラフィックス・ルーチンの小グループは,Win32 ルーチンと同じ名前をもっています。このため,プログラム単位が USE DFLIBS (QuickWin ルーチン・インタフェース定義をインクルード) と USE DFWIN (Win32 API ルーチン・インタフェース定義をインクルード) の両方をインクルードする場合,名前の衝突が起こる可能性があります。

QuickWin ルーチンは,SDK ルーチンとして同じ関数を実行しますが,装置番号を取り,また,引数の 1 つとして装置コンテキスト (DC) を取る代わりに呼び出し時にフォーカスのある装置番号を使います。

この状態を処理するためには,特別な MSFWIN$ 接頭辞が Win32 ルーチンに対して使われます。これらの接頭辞名は,USE DFWIN のみを指定した場合でも使われなければなりません。

たとえば,Rectangle は QuikWin ルーチンで Win32 SDK ルーチンではありませんので,SDK ルーチンを参照するには名前 MSFWIN$Rectangle を使わなければなりません。

QuickWin ルーチン Win32 API ルーチン
ARC MSFWIN$Arc
ELLIPSE MSFWIN$Ellipse
FLOODFILL MSFWIN$FloodFill
GETBKCOLOR MSFWIN$GetBkColor
GETPIXEL MSFWIN$GetPixel
GETTEXTCOLOR MSFWIN$GetTextColor
LINETO MSFWIN$LineTo
PIE MSFWIN$Pie
POLYGON MSFWIN$Polygon
RECTANGLE MSFWIN$Rectangle
1 MSFWIN$SelectPalette
SETBKCOLOR MSFWIN$SetBkColor
SETPIXEL MSFWIN$SetPixel
SETTEXTCOLOR MSFWIN$SetTextColor

1 SELECTPALLETE という名前の QuickWin ルーチンはありません。

データ型定義の理解

DFWIN モジュールで参照されるファイルは,Win32 WINDOWS.H ヘッダ・ファイルの Fortran バージョン (サブセット) です。データ型の対応関係を次表に示します。

Win32 データ型 等価な Fortran データ型
BOOL, BOOLEAN LOGICAL(4)
BYTE BYTE
CHAR, CCHAR, UCHAR CHARACTER
COLORREF INTEGER(4)
DWORD, INT, LONG, ULONG INTEGER(4)
SHORT, USHORT, WORD INTEGER(2)
FLOAT REAL(4)
すべてのハンドル INTEGER(4)
すべてのポインタ (LP*, P*) INTEGER(4) (整数ポインタ)

以下に引数の等価なデータ型に関する他の注意を示します。

WINDOWS.H の構造体は,DFWINTY では構造型に変換されています。構造体中のユニオンは,構造型のユニオンとマップに変換されています。構成要素名は変更されていません。ビット欄は Fortran の INTEGER(4) データ型に変換されています。ビット欄を参照する関数は,DFWIN.F90 モジュールに次の形式名で含まれています。

	StructureName$BitfieldName

これらの関数は,整数の引数を取り整数を返します。すべてのビット欄は符号なし整数です。以下に WINDOWS.H 定義を示します。Win32 構造体が Fortran 構造型として表わされるプログラム例にも使われます。

WINDOWS.H の定義

	typedef struct _LDT_ENTRY {
	  WORD LimitLow;
	  WORD BaseLow;
	  union {
	     struct {
	        BYTE BaseMid;
	        BYTE Flags1;
	        BYTE Flags2;
	        BYTE BaseHi;
	     } Bytes;

	     struct {
	        DWORD BaseMid : 8;
	        DWORD Type : 5;
	        DWORD Opl : 2;
	        DWORD Pres : 1;
	        DWORD LimitHi : 4;
	        DWORD Sys : 1;
	        DWORD Reserved_0 : 1;
	        DWORD Default_Big : 1;
	        DWORD Granularity : 1;
	        DWORD BaseHi : 8;
	     } Bits;
	  } HighWord;
	 } LDT_ENTRY, *PLDT_ENTRY;

_LDT_ENTRYPLDT_ENTRY は,Fortran の定義には存在しないことに注意してください。また,Bits.xxx が C 言語と同じではないことに注意してください。Fortran では,ビット欄関数を使用する必要があります。たとえば,C 変数 yyy.HighWord.Bits.BaseHi は,LDT_ENTRY$BaseHi(ldtentry%HighWord%bits) として Fortran では表現されます。

以下の Fortran 例は,対応する Fortran データ定義の使用と,ビット取り出しユーティリティ・ルーチンの使用を示しています。

	Program Test
	  type T_LDT_ENTRY$HIGHWORD_BYTES
	    sequence
	    BYTE  BaseMid
	    BYTE  Flags1
	    BYTE  Flags2
	    BYTE  BaseHi
	  end type T_LDT_ENTRY$HIGHWORD_BYTES

	  type  T_LDT_ENTRY$HIGHWORD
	    sequence
	    union
	      map
	        type (T_LDT_ENTRY$HIGHWORD_BYTES)  Bytes
	      end map
	      map
	        integer(4)  Bits
	      end map
	    end union
	  end type T_LDT_ENTRY$HIGHWORD

	  type T_LDT_ENTRY
	    sequence
	    integer(2) LimitLow
	    integer(2) BaseLow
	    type (T_LDT_ENTRY$HIGHWORD)  HighWord
	  end type T_LDT_ENTRY

	  type(T_LDT_ENTRY) ldtentry
	  integer(4) thebits
	  external LDT_ENTRY$BaseHi
	  integer(4) LDT_ENTRY$BaseHi

	   ldtentry%HighWord%bits = #ABFFFFFF
	   thebits = LDT_ENTRY$BaseHi(ldtentry%HighWord%bits)
	   write(*,'(Z)') thebits
	end program Test

	integer(4) function LDT_ENTRY$BaseHi (Bits)
	  integer(4) Bits
	  LDT_ENTRY$BaseHi = IAND(ISHFT(bits,-24),#FF)
	end function LDT_ENTRY$BaseHi

TYPE 文の使用に加えて,以下の例で示すように STRUCTUREを使うことができます。埋め込みデータ型がある場合,データ型定義はより読みやすくなります。要素の選択がより自然にもなります。以下に例を示します。

	program struct
	  STRUCTURE /T_LDT_ENTRY/
	    integer(2) LimitLow
	    integer(2) BaseLow
	    UNION
	      MAP
	        STRUCTURE /f_Bytes/ Bytes
	          BYTE  BaseMid
	          BYTE  Flags1
	          BYTE  Flags2
	          BYTE  BaseHi
	        END STRUCTURE
	      END MAP
	      MAP
	        STRUCTURE /f_Bits/ Bits
	          INTEGER(4) Bits
	        END STRUCTURE
	      END MAP
	    END UNION
	  END STRUCTURE

	  type(T_LDT_ENTRY) ldtentry
	  ldtentry%Bits%Bits = #7f6f5f4f
	  write(*,'(8Z)') ldtentry%Bits%Bits
	  write(*,'(8Z)') ldtentry%Bytes%BaseMid
	end program

このプログラムは,以下の結果を出力します。

	7F6F5F4F
	 4F

2つ 方法の STRUCTURE 文でデータ・オブジェクトを作成することができます。以下のうちの 1 つを使います。

プログラム例は,構造化されたデータ・オブジェクトの欄を参照する方法を示しています。以下のようになります。

	I4=ldtentry%Bits%Bits

プログラム例とサンプル

Visual Fortran は,Win32 ルーチンを呼び出す Fortran Windows アプリケーションの様々なサンプル・プログラムを提供しています。たとえば,以下のようなものがあります。

参考資料

Win32 API ルーチンと Windows プログラミングについては,以下を参照してください。