インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
このトピックは、Windows* にのみ適用されます。
このセクションでは、プロジェクトの作成、COM サーバーの設定、コードの生成、および Fortran COM サーバーのサンプル・プロジェクト Adder の実装方法について説明します。
Fortran COM サーバーを作成するには、最初に新しいプロジェクトを作成します。
Visual Studio* IDE を起動します。[ファイル] > [新規作成] > [プロジェクト] を選択します。
[新しいプロジェクト] ダイアログボックスで、[Intel® Fortran Projects (インテル® Fortran プロジェクト)] を展開して、[COM Server (COM サーバー)] をクリックします。
サンプル・プロジェクトを作成するには、[In-process Server (DLL) (インプロセス・サーバー (DLL))] を選択します。次の操作を行ってください。
[Name (プロジェクト名)] に Adder と入力します。
プロジェクト・フォルダーの場所を指定します。
[OK] をクリックします。
各プロジェクトに対して、プロジェクト・ウィザードを 1 度だけ使用して、プロジェクト・ファイルと骨組みとなるテンプレートを作成することができます。Fortran COM サーバーウィザードに、デフォルトのインターフェイス名とクラスの派生型名が表示されます。
次の操作を行ってください。
1. クラス名に AddingMachine と入力します。
2. デフォルトのインターフェイス名を短縮して IAdd とします。
3. デフォルトのクラスの派生型名を使用します。
4. [Finish (完了)] をクリックします。([Cancel (キャンセル)] をクリックすると、プロジェクトの作成は終了します。)
プロジェクトが作成され、COM サーバー階層エディターに COM サーバー階層ファイル (adder.hie) が表示されます。
COM サーバー階層エディターを使用して、COM サーバーの属性 (例えば、クラス、インターフェイス、メソッド) をインタラクティブに定義することができます。ユーザー・インターフェイスは 2 つのペインから構成されています。
上部ペインは、階層内の属性情報を表示するツリー・コントロールです。
下部ペインは、階層内の選択された要素の IDL 定義を表示するパネルです。
階層内で右クリックして表示されるコンテキスト・メニューから、挿入、削除、変更することができます。コンテキスト・メニューを使用して項目のプロパティーを変更することもできます。例えば、IAdd 要素を右クリックして [プロパティ] を選択し、IAdd インターフェイスのプロパティーを表示します。そして、Adder サンプルで COM サーバー・インターフェイスのみサポートするように、[Is Dual] プロパティーの値を False に変更することができます。
次に階層について説明します。
ルートは COM サーバーです。
COM サーバー直下の子はクラスです。サンプルでは、初期状態で階層に含まれているのは AddingMachine クラスのみです。COM サーバーにクラスを追加することができます。
クラス直下の子はインターフェイスとクラスの派生型です。サンプルでは、IAdd インターフェイスと AddingMachine_InstanceData 派生型が階層に含まれています。各クラスには派生型が 1 つだけ含まれます。クラスにインターフェイスを追加することができます。
インターフェイス直下の子はメソッド (1 つまたは複数) です。
メソッド直下の子はメソッド引数 (1 つまたは複数) です。
クラス、インターフェイス、メソッド、プロパティー、引数を追加する方法:
親項目を選択して右クリックし、適切な追加メニューを選択します。
項目を削除する方法:
削除する項目を選択して右クリックし、[Delete (削除)] を選択します。
[Delete (削除)] ボタンをクリックします。
Adder COM サーバーのサンプルでは、IAdd インターフェイスにメソッドを追加します。
IAdd インターフェイスを右クリックして、[Add Method (メソッドの追加)] を選択します。
メソッド名に Clear と入力します。
ステップ 1 と 2 を繰り返して、ステップ 2 でメソッド名に Add と入力します。
Add メソッドには引数が必要です。Operand という名前の Operand 引数を追加します。
Add メソッドを右クリックして、[Add Argument (引数の追加)] を選択します。
引数名に Operand と入力します。
引数のデフォルトのデータ型は INTEGER(4) です。
[プロパティ] ウィンドウで、[Fortran Type (Fortran 型)] プロパティーの値を REAL(4) に変更します。
3 番目 (このサンプルでは最後) のメソッドを追加します。
IAdd インターフェイスを右クリックして、[Add Method (メソッドの追加)] を選択します。
メソッド名に GetValue と入力します。
GetValue メソッドには CurrentValue 引数が必要です。CurrentValue 引数を追加します。
GetValue メソッドを右クリックして、[Add Argument (引数の追加)] を選択します。
引数名に CurrentValue と入力します。
CurrentValue 引数では以下の設定を行います。
[Fortran Type (Fortran 型)] プロパティーの値を REAL(4) に設定します。
[Intent (インテント)] プロパティーの値を [out,retval] に設定します。
次のような画面が表示されます。
これで、サンプルのサーバー定義は完了です。[ファイル] > [adder.hie の保存] メニューを使用してファイルを保存すると、Fortran ソースが再生成されます。
サーバー、クラス、インターフェイス、メソッド、引数、およびインスタンスのプロパティーのプロパティー・ページ (右のペイン) に関する詳細は、「プロパティー・ページの説明」を参照してください。
サーバーの定義を変更する場合は、エディターで adder.hie を開きます。
階層ペインの使用
AddingMachine の例で示したように、階層ペインにはサーバーの定義 (クラス、インターフェイス、メソッドなど) が表示されます。階層ペインのユーザー・インターフェイスは、次の機能をサポートしています。
子項目の表示/非表示 |
項目の横にある正符号 (+) をクリックすると子が表示され、負記号 (-) をクリックすると子が非表示になります。 |
新しい項目の追加 |
階層内で追加する項目の親項目を選択して右クリックし、適切な追加メニューを選択します。 |
項目の削除 |
削除する項目を選択して右クリックし、[Delete (削除)] を選択します。項目を削除すると、その項目の子もすべて削除されます。 |
項目の名前変更 |
名前を変更する項目を選択して右クリックし、[Rename (名前の変更)] を選択します。 |
項目の順序変更 |
階層ペインでは、項目をドラッグアンドドロップして順序を変更することができます。 階層内の一部の項目の順序は非常に重要です。特に、次の点に注意してください。
|
プロパティー・ページの説明
プロパティー・ページは [Properties (プロパティ)] ウィンドウに表示されます。次のプロパティー・ページを利用できます。
Server Properties (サーバー・プロパティー):
Type Library GUID (タイプ・ライブラリーの GUID) |
サーバーのタイプ・ライブラリーの一意の識別子。通常、Fortran COM サーバーウィザードによって生成されるデフォルト値を変更する必要はありません。 |
Type Library Version (タイプ・ライブラリーのバージョン) |
現在のタイプ・ライブラリーのバージョン。 |
HelpString |
IDL ファイルでライブラリーのヘルプ文字列属性に設定される文字列。 |
Class Properties (クラス・プロパティー):
ProgID |
クラスのプログラム ID (またはテキストエイリアス)。バージョンに依存しません。ProgID は COMCreateObjectByProgID などの呼び出しに使用されます。 |
Version (バージョン) |
現在のクラスのバージョン。バージョン固有の ProgID を定義するために ProgID に追加されます。 |
Short name (ショート名) |
クラスのショート名。一部の生成するファイル名で使用されます。 |
Description (説明) |
レジストリーでクラスの ProgID キーのデフォルト値として使用される文字列。この文字列は、通常、システムに登録されているオブジェクトのリストを表示する OLE-COM Object Viewer などのツールによって使用されます。 |
HelpString |
IDL ファイルでクラスのヘルプ文字列属性に設定される文字列。 |
Threading model (スレッド化モデル) |
クラスのスレッド化モデル。Apartment (集合) と Single (単一) の 2 つがあります。各スレッド化モデルについての詳細は、「COM サーバーの詳細」の「スレッド化モデル」を参照してください。 |
CLSID |
クラスの一意の識別子。通常、ウィザードによって生成されるデフォルト値を変更する必要はありません。 |
Interface Properties (インターフェイス・プロパティー):
Is Dual |
True の場合は、IDL ファイルでデュアル・インターフェイス属性が設定されます。デュアル・インターフェイスは、COM クライアントとオートメーション・クライアントの両方をサポートします。 |
Is OleAutomation |
True の場合は、「メソッドおよびプロパティーのデータ型」で説明されているように、インターフェイスはオートメーション互換のデータ型のみを使用します。 |
Is Default |
True の場合は、IDL ファイルでこのインターフェイスのデフォルトのインターフェイス属性が設定されます。デフォルトの属性は、オブジェクトのプログラミング可能なインターフェイスのデフォルトで、マクロ言語によって使用されます。 |
HelpString |
IDL ファイルでインターフェイスのヘルプ文字列属性に設定される文字列。 |
IID |
インターフェイスの一意の識別子。通常、ウィザードによって生成されるデフォルト値を変更する必要はありません。 |
Method Properties (メソッド・プロパティー):
DISPID |
オートメーション・クライアントによって使用されるメソッドの識別子。 |
HelpString |
IDL ファイルでメソッドのヘルプ文字列属性に設定される文字列。 |
Property Method (プロパティー属性) |
チェックされている場合、メソッドはプロパティーの get_ または put_ メソッドです。 |
Argument Properties (引数プロパティー)
Fortran Type (Fortran 型) |
引数の Fortran データ型。リストからデータ型を 1 つ選択するか、データ型を入力します。各データ型についての詳細は、「メソッドおよびプロパティーのデータ型」を参照してください。 |
IDL type (IDL 型) |
IDL データ型。事前定義済みリストから Fortran データ型を選択した場合は、対応する IDL データ型がデフォルトで表示されます。リストからデータ型を 1 つ選択するか、データ型を入力します。各データ型についての詳細は、「メソッドおよびプロパティーのデータ型」を参照してください。 |
Intent (インテント) |
引数の INTENT。次のいずれかです。
|
By Reference (参照渡し) |
引数は値ではなく参照で渡されます。Intent (インテント) が [in] の場合のみ有効です。Intent (インテント) が [out] および [in, out] の場合は、自動的に参照で渡されます。 |
Is Optional |
True の場合、引数はオプションです。オプションの引数は Variant データ型を使用して渡されます。 |
Dimensions (次元) |
配列次元の数 (引数がスカラーの場合は 0)。 |
Instance Type Properties (インスタンス型プロパティー):
Module name (モジュール名) |
UclassnameTY.f90 ファイルで定義されているモジュールの名前。 |
Constructor name (コンストラクター名) |
UclassnameTY.f90 ファイルで定義されているクラス・コンストラクターの名前。 |
Destructor name (デストラクター名) |
UclassnameTY.f90 ファイルで定義されているクラス・デストラクターの名前。 |
生成されたコードの変更
階層ファイルを保存する際に、Fortran ソースが生成 (または再生成) されます。ソースファイルは、次のように格納されます。
変更するソースファイルは、[Source Files (ソースファイル)] フォルダーにあります。
変更する必要がないファイルは [Do Not Edit] フォルダーにあります。
[Source Files (ソースファイル)] フォルダー内の次のファイルを変更します。
UAddingMachineTY.f90: クラスの派生型を定義するモジュールが含まれています。
UIAdd.f90: IAdd メソッドが含まれています。
初期状態では、UAddingMachineTY.f90 には次のコードが含まれています。
このファイルには、AddingMachine_USE という名前のモジュールが (classname_USE という形式で) 含まれています。このモジュールでは、3 箇所でクラス固有のコードを追加する必要があります。
最初に、<BnDEF> および <EnDEF> と記述されている箇所にクラスの派生型を追加します。初期状態では、コンパイルエラーが発生しないように "仮の整数" フィールドが含まれています。クラスに per-object データが含まれている場合は、"仮の整数" フィールド行を削除して、派生型にデータを追加します。AddingMachine クラスでは、オブジェクトが現在の値を格納する場所に次のコードを追加します。
real (4) CurrentValue
モジュールには、AddingMachine_CONSTRUCTOR および AddingMachine_DESTRUCTOR (classname_CONSTRUCTOR および classname_DESTRUCTOR below と表記される) の 2 つモジュール・プロシージャーも含まれています。1 つ目のプロシージャーは <BnCON> および <EnCON>、2 つ目のプロシージャーは <BnDES> および <EnDES> と記述されています。
classname_CONSTRUCTOR プロシージャーは、クラスの派生型のインスタンスが作成された直後に (新しいオブジェクトが作成されたため) 呼び出されます。必要に応じて、この関数で、クラスの派生型フィールドを初期化します。新しい派生型は引数として関数に渡されます。AddingMachine クラスでは、次の文を追加して現在の値を 0 に初期化します。
ObjectData%CurrentValue = 0
classname_DESTRUCTOR プロシージャーは、クラスの派生型インスタンスが破棄される直前に (オブジェクトが破棄されるため) 呼び出されます。必要に応じて、この関数で、クラスの派生型フィールドで使用されているリソースを解放します。派生型は引数として関数に渡されます。AddingMachine クラスでは、何も追加する必要はありません。
次に、UIAdd.f90 を変更します。初期状態では、UIAdd.f90 には次のコードが含まれています。
クラスによって定義された各インスタンスに対して、Uinterfacename.f90 (for example UIadd.f90) という名前のファイルが作成されます。このファイルには、クラスのメソッドが含まれています。各メソッドには interfacename_methodname (例: IAdd_Clear) という名前が付けられます。各メソッドは、最初の引数としてクラスの派生型に渡される関数です。これにより、関数は per-object データにアクセスできるようになります。各関数は、HRESULT と呼ばれる 32 ビットの COM ステータスコードを返します。S_OK は、成功時のステータスを定義する引数です。COM ステータスコードについての詳細は、「COM ステータスコード: HRESULT」を参照してください。
各メソッドの ! TODO: Add implementation 行をメソッドのコードと置換します。IAdd インターフェイスでは、3 つのメソッドのコードは次のようになります。
IAdd_Clear: ObjectData%CurrentValue = 0
IAdd_Add: ObjectData%CurrentValue = ObjectData%CurrentValue + Operand
IAdd_GetValue: CurrentValue = ObjectData%CurrentValue
ファイルを保存して、[ビルド] メニューから [ソリューションのビルド] をクリックして、サーバーをビルドします。これで、COM サーバーの完成です。
サーバー・プロジェクト (インプロセス・サーバー (DLL) またはアウトオブプロセス・サーバー (EXE) のいずれでも) の作成中、アプリケーション・ウィザードは Visual C++* がインストールされているかどうかを特定します。インストールされている場合は、MIDL コンパイラーは Visual C++* の C プリプロセッサーを使用します。これはデフォルトの動作であり、また、推奨される設定です。Visual C++* がインストールされていない場合は、アプリケーション・ウィザードは、MIDL コンパイラーが MIDL ソースファイルの前処理に Fortran プリプロセッサーを使用するように指示します。これは、MIDL コンパイラーの [Additional Options (追加のオプション)] に次のオプションが設定されているために行われる動作です。/cpp_cmdifort /cpp_opt"/nologo /fpp /P /E /Qoption,fpp,/no-fort-cont"
後で Visual C++* をインストールして、MIDL で Visual C++* の C プリプロセッサーが使用されるようにするには、MIDL コンパイラーの [Additional Options (追加のオプション)] からこれらのオプションを削除します。