この節は,Visual Fortran アプリケーションからの Win32 ルーチンの呼び出しに関する一般的な情報を提供しています。以下のトピックがあります。
Visual Fortran と Win32 ルーチンの比較
Visual Fortran は,Fortran 95 標準に準拠する Fortran 95/90 言語要素 (たとえば,組込み手続や文) を提供しています。また,Visual Fortran は,ライブラリー・ルーチンを含む言語拡張の言語要素も提供しています。
Visual Fortran が提供するライブラリー・ルーチンは以下のとおりです。
Fortran 言語から呼び出されることを仮定しています。たとえば,文字引数は Fortran 文字変数であると仮定され,ヌルで終わる C 文字列ではありません。
等価な Win32 オペレーティング・システム・ルーチンから区別するために名前の最後に QQ を付けています。
『言語リファレンス』の「A-Z 索引」で説明しています。ルーチンの説明は,たとえば,USE DFLIB のように,インタフェース定義をインクルードするために適切な USE 文を一覧表示しています。
オペレーティング・システムが提供する適切な Windows システム (Win32) ルーチンを呼び出します。
Windows システムに特有なものです。(1 つの例外は,Visual Fortran 可搬用ライブラリー・ルーチンの多くが U*X システムに存在することです。)
対照的に,Windows オペレーティング・システムが提供する Win32 Application Programming Interface (API) ルーチンは以下のとおりです。
しかしながら,Visual Fortran は,Visual Fortran から Win32 ルーチンを簡単に呼び出せるようにインタフェース宣言定義を提供しています (たとえば,Fortran データ引数を参照渡しとして指定できます)。これらのインタフェース定義を得るには,プログラムに USE DFWIN 文を追加します (以下で説明します)。
たとえば,GetSystemTime のようにしばしば名前として複数の単語が結合されています。
『Platform SDK』オンライン・ドキュメントに説明されています。特定のルーチンを参照するには,HTML HelpViewer の「キーワード」または「検索」を使用します。呼び出し書式は,ルーチンの引数の説明に続いて,ページの上部に一覧表示されています。Win32 ルーチンの説明ページの下部の QuickInfo は,必要なインポート・ライブラリーを一覧表示しています。
Windows システムに特有なものです。
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 つを行います。
USE DFWIN 文は,多くの Windows ルーチンの全てのパラメタとインタフェースを Visual Fortran プログラムで利用可能にします。Windows 機能を使用するプログラムや副プログラムは,USE DFWIN 文をインクルードします。これにより,各副プログラムがグラフィックスの呼び出しを行うことができるようになります。
宣言文 (たとえば,IMPLICIT NONE または INTEGER) または宣言文を含む他のモジュールの前に USE 文を追加します。
呼び出すルーチン特有のライブラリーを特定するには,『Platform SDK』ドキュメントのルーチン・ページの下部の QuickInfo を参照します。ここにインポート・ライブラリー名が一覧表示されています。たとえば,GetSystemTime のみを呼び出すには,kernel32.mod (2 進形式) で提供されるインタフェース定義が必要になります。これを行うには,以下の USE 文を追加します。
USE KERNEL32
さらにコンパイル時間を短くしたい場合,USE 文に ONLY キーワードを追加します。以下のようにします。
USE KERNEL32, only: GetSystemTime, GetLastError
Visual Fortran インタフェース定義を使った Win32 ルーチンの呼び出し
Visual Fortran インタフェース定義をインクルードした後,適切な Win32 ルーチンを呼び出すには,以下のガイドラインに従います。
文字引数がある場合,Win32 ルーチンを呼び出す前に,終了子としてヌル文字を文字変数に与えます。
ルーチンが結果を返す (関数) か返さない (サブルーチン) かどうか。たとえば,GetSystemTime ルーチン呼び出し書式は,VOID で始まっているので,このルーチンは CALL 文でサブルーチンとして呼び出します。
テキスト・エディタ (メモ帳など) で,...\DF98\INCLUDE\ にある kernel32.f90 ファイルを開きます。
ルーチン名 (たとえば,GetSystemTime) を検索します。
インタフェース定義を表示し,その部分をテキスト・エディタ画面のソース・ファイルにカット・アンド・ペーストします。
テキスト・エディタ (メモ帳など) で,...\DF98\INCLUDE\ にある DFWINTY.F90 を開きます。
データ型名 (たとえば,T_SYSTEMTIME) を検索します。
データ型定義を表示し,その部分をテキスト・エディタ画面のソース・ファイルにカット・アンド・ペーストします。定義された欄名は後で使用されることに注意してください。
TYPE (T_SYSTEMTIME) MYTIME
! 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) (整数ポインタ) |
以下に引数の等価なデータ型に関する他の注意を示します。
引数が『Platform SDK』ドキュメントでポインタとして説明されている場合,その引数の対応する Fortran インタフェース定義は,REFERENCE プロパティ (「cDEC$ ATTRIBUTES コンパイラ指示文」を参照) を持ちます。古いインタフェース定義は,Compaq Fortran ポインタ・データ型を使用し,引数のアドレスを渡します。
ポインタ引数は,長さで正しく 32 ビット (4 バイト) です。Windows オペレーティング・システムの将来のバージョンは,64 ビット (8 バイト) のポインタ引数をサポートする予定です。
DATA forstring /'This is a null-terminated string.'C/
CHAR 組込み関数を使うこともできます。
character(LEN=32) forstring forstring= "Courier New" // CHAR(0)
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_ENTRY と PLDT_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 つを使います。
type(T_LDT_ENTRY) ldtentry
RECORD /T_LDT_ENTRY/ ldtentry
プログラム例は,構造化されたデータ・オブジェクトの欄を参照する方法を示しています。以下のようになります。
I4=ldtentry%Bits%Bits
Visual Fortran は,Win32 ルーチンを呼び出す Fortran Windows アプリケーションの様々なサンプル・プログラムを提供しています。たとえば,以下のようなものがあります。
...\Df98\Misc フォルダ中の Fortran Console アプリケーション:Console,Forprint など。
...\Df98\QuickWin フォルダ中の Fortran QuickWin アプリケーション:Conapp, Cleanwin, Testscrl など。
...\Df98\Advanced\Win32 フォルダ中の Fortran Windows アプリケーション:Generic,Bounce など。
Win32 API ルーチンと Windows プログラミングについては,以下を参照してください。
HTML HelpViewer『Platform SDK』トピック
『Microsoft Win32 Developer's Reference Library』(David Iseminger 著, Microsoft Press)
『Programming Windows』(Charles Petzold 著,Microsoft Press)
『Windows NT Win32 API SuperBible』(Richard Simon 著,Waite Group Press)
『Win32 Programming』(Brent Rector と Joseph Newcomer 著,Addison-Wesley)
『Win32 System Programming』(Johnson Hart 著,Addison-Wesley)