インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

Fortran COM サーバーの作成 (Windows*)

このトピックは、Windows* にのみ適用されます。

このセクションでは、プロジェクトの作成、COM サーバーの設定、コードの生成、および Fortran COM サーバーのサンプル・プロジェクト Adder の実装方法について説明します。

Fortran COM サーバーを作成するには、最初に新しいプロジェクトを作成します。

Visual Studio* IDE での Fortran COM サーバー・プロジェクトの作成方法

  1. Visual Studio* IDE を起動します。[ファイル] > [新規作成] > [プロジェクト] を選択します。

  2. [新しいプロジェクト] ダイアログボックスで、[Intel® Fortran Projects (インテル® Fortran プロジェクト)] を展開して、[COM Server (COM サーバー)] をクリックします。



サンプル・プロジェクトを作成するには、[In-process Server (DLL) (インプロセス・サーバー (DLL))] を選択します。次の操作を行ってください。

  1. [Name (プロジェクト名)] に Adder と入力します。

  2. プロジェクト・フォルダーの場所を指定します。

  3. [OK] をクリックします。

各プロジェクトに対して、プロジェクト・ウィザードを 1 度だけ使用して、プロジェクト・ファイルと骨組みとなるテンプレートを作成することができます。Fortran COM サーバーウィザードに、デフォルトのインターフェイス名とクラスの派生型名が表示されます。



次の操作を行ってください。

1. クラス名に AddingMachine と入力します。

2. デフォルトのインターフェイス名を短縮して IAdd とします。

3. デフォルトのクラスの派生型名を使用します。

4. [Finish (完了)] をクリックします。([Cancel (キャンセル)] をクリックすると、プロジェクトの作成は終了します。)

プロジェクトが作成され、COM サーバー階層エディターに COM サーバー階層ファイル (adder.hie) が表示されます。

COM サーバー階層エディターを使用した COM サーバーの定義

COM サーバー階層エディターを使用して、COM サーバーの属性 (例えば、クラス、インターフェイス、メソッド) をインタラクティブに定義することができます。ユーザー・インターフェイスは 2 つのペインから構成されています。

階層内で右クリックして表示されるコンテキスト・メニューから、挿入、削除、変更することができます。コンテキスト・メニューを使用して項目のプロパティーを変更することもできます。例えば、IAdd 要素を右クリックして [プロパティ] を選択し、IAdd インターフェイスのプロパティーを表示します。そして、Adder サンプルで COM サーバー・インターフェイスのみサポートするように、[Is Dual] プロパティーの値を False に変更することができます。

次に階層について説明します。

クラス、インターフェイス、メソッド、プロパティー、引数を追加する方法:

  1. 親項目を選択して右クリックし、適切な追加メニューを選択します。

項目を削除する方法:

  1. 削除する項目を選択して右クリックし、[Delete (削除)] を選択します。

  2. [Delete (削除)] ボタンをクリックします。

Adder COM サーバーのサンプルでは、IAdd インターフェイスにメソッドを追加します。

  1. IAdd インターフェイスを右クリックして、[Add Method (メソッドの追加)] を選択します。

  2. メソッド名に Clear と入力します。

  3. ステップ 1 と 2 を繰り返して、ステップ 2 でメソッド名に Add と入力します。

Add メソッドには引数が必要です。Operand という名前の Operand 引数を追加します。

  1. Add メソッドを右クリックして、[Add Argument (引数の追加)] を選択します。

  2. 引数名に Operand と入力します。

引数のデフォルトのデータ型は INTEGER(4) です。

[プロパティ] ウィンドウで、[Fortran Type (Fortran 型)] プロパティーの値を REAL(4) に変更します。



3 番目 (このサンプルでは最後) のメソッドを追加します。

  1. IAdd インターフェイスを右クリックして、[Add Method (メソッドの追加)] を選択します。

  2. メソッド名に GetValue と入力します。

GetValue メソッドには CurrentValue 引数が必要です。CurrentValue 引数を追加します。

  1. GetValue メソッドを右クリックして、[Add Argument (引数の追加)] を選択します。

  2. 引数名に CurrentValue と入力します。

CurrentValue 引数では以下の設定を行います。

  1. [Fortran Type (Fortran 型)] プロパティーの値を REAL(4) に設定します。

  2. [Intent (インテント)] プロパティーの値を [out,retval] に設定します。

次のような画面が表示されます。



これで、サンプルのサーバー定義は完了です。[ファイル] > [adder.hie の保存] メニューを使用してファイルを保存すると、Fortran ソースが再生成されます。

サーバー、クラス、インターフェイス、メソッド、引数、およびインスタンスのプロパティーのプロパティー・ページ (右のペイン) に関する詳細は、「プロパティー・ページの説明」を参照してください。

サーバーの定義を変更する場合は、エディターで adder.hie を開きます。

階層ペインの使用

AddingMachine の例で示したように、階層ペインにはサーバーの定義 (クラス、インターフェイス、メソッドなど) が表示されます。階層ペインのユーザー・インターフェイスは、次の機能をサポートしています。

子項目の表示/非表示

項目の横にある正符号 (+) をクリックすると子が表示され、負記号 (-) をクリックすると子が非表示になります。

新しい項目の追加

階層内で追加する項目の親項目を選択して右クリックし、適切な追加メニューを選択します。

項目の削除

削除する項目を選択して右クリックし、[Delete (削除)] を選択します。項目を削除すると、その項目の子もすべて削除されます。

項目の名前変更

名前を変更する項目を選択して右クリックし、[Rename (名前の変更)] を選択します。

項目の順序変更

階層ペインでは、項目をドラッグアンドドロップして順序を変更することができます。

階層内の一部の項目の順序は非常に重要です。特に、次の点に注意してください。

  • インターフェイスのメソッド順は、そのクラスの VTBL のメソッド順を定義します。メソッドの順序を変更すると、既存のクライアントが使用できなくなります。

  • メソッドの引数順は、そのメソッドのインターフェイスの引数順を定義します。引数の順序を変更すると、既存のクライアントが使用できなくなります。

プロパティー・ページの説明

プロパティー・ページは [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。次のいずれかです。

  • [in] - メソッドは引数の値を読み取りますが、変更しません。

  • [out] - メソッドは引数の値を読み取りませんが、変更します。

  • [in, out] - メソッドは引数の値を読み取り、変更します。

  • [out, retval] - 引数はメソッドの戻り値です。

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 (ソースファイル)] フォルダー内の次のファイルを変更します。

初期状態では、UAddingMachineTY.f90 には次のコードが含まれています。



このファイルには、AddingMachine_USE という名前のモジュールが (classname_USE という形式で) 含まれています。このモジュールでは、3 箇所でクラス固有のコードを追加する必要があります。

次に、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 サーバーの完成です。

COM サーバー・プロジェクトと MIDL コンパイラー

サーバー・プロジェクト (インプロセス・サーバー (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 (追加のオプション)] からこれらのオプションを削除します。