インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
このトピックは、Windows* にのみ適用されます。
このセクションでは、Fortran COM サーバーを設計する際に考慮する必要がある情報について説明します。次のトピックについて説明します。
COM では、スレッド、プロセス、およびマシン間で引数を渡すことができるため、メソッドとプロパティーで使用されるデータ型を制限しています。これにより、DLL など、常に呼び出し元と同じアドレス空間で実行される以前のテクノロジーでは発生しない問題が発生します。
COM は、オートメーション互換データ型というデータ型のセットを定義します。オートメーション・インターフェイスおよびデュアル・インターフェイスでは、これらのデータ型のみ使用することができます。COM インターフェイスをこれらのデータ型に制限することには、次の 2 つのメリットがあります。
インテル® Fortran、Visual Basic*、および Visual C++* を含む言語で記述されたクライアントからサーバーを使用することができます。
COM により、スレッド、プロセス、およびマシン間の引数の受け渡しが自動的に処理されます。これを、タイプ・ライブラリー・マーシャリングと言います。詳細は、「COM サーバーの詳細」の「マーシャリング、プロキシー、およびスタブ」を参照してください。
サーバーをオートメーション互換データ型に制限する方法:
[Interface (インターフェイス)] プロパティー・ページで [Is OleAutomation] を True に設定します。デュアル・インターフェイスを定義する場合、このオプションは自動的に設定されます。
[Argument (引数)] プロパティー・ページで、次の [Fortran Type (Fortran 型)] と [IDL Type (IDL 型)] の組み合わせのみ使用します。
インテル® Fortran では、通貨型 (Currency)、10 進型 (Decimal)、ユーザー定義型、オートメーション互換データ型はサポートされていないことに注意してください。
Fortran 型 |
IDL 型 |
---|---|
INTEGER(1) |
unsigned char |
INTEGER(2) |
short |
INTEGER(4) |
long SCODE int |
INTEGER(INT_PTR_KIND()) |
IUnknown* IDispatch* |
REAL(4) |
float |
REAL(8) |
double DATE |
LOGICAL(2) |
VARIANT_BOOL |
LOGICAL(4) |
long |
CHARACTER(1) |
unsigned char |
CHARACTER(*) |
BSTR |
BYTE |
unsigned char |
TYPE(VARIANT) |
VARIANT (上記のいずれか、または SafeArray) |
インターフェイスをオートメーション互換データ型に制限しない場合は、IDL (Interface Description Language) で使用可能なデータ型に制限する方法があります。
Fortran COM サーバーウィザードは、サーバーの記述から IDL ファイルを自動的に生成します。MIDL コンパイラーは、IDL ファイルをタイプ・ライブラリーにコンパイルします。MIDL は、スレッド、プロセス、およびマシン間での引数の受け渡しに必要なコードを自動的に生成することもできます。ただし、このオプションを使用するには C コンパイラーが必要です。詳細は、「COM サーバーの詳細」の「ウィザードを使用したコードの生成」を参照してください。
インターフェイスを IDL のデータ型に制限しない場合、残るオプションは次の方法のみです。
カスタム・マーシャリングの実装 - 詳細は、「COM サーバーの詳細」の「マーシャリング、プロキシー、およびスタブ」を参照してください。
集合、スレッド、プロセスの境界を超えてサーバーを使用しない。この場合、これらの境界を越えて引数を渡すことができないため、サーバーを使用することはできません。
各関数は、HRESULT と呼ばれる 32 ビットの COM ステータスコードを返します。HRESULT は次のフィールドから構成されています。
最上位ビット (ビット 31) は、関数が成功したか、失敗したかを示します。このビットは、関数が失敗すると設定されます。Fortran では、HRESULT が 0 よりも小さいかどうか比較して、関数が失敗したかどうかをテストできます。
ビット 16 からビット 27 は、HRESULT を発行した機能を示す機能コードです。Microsoft* によっていくつかの機能コードが定義されています。独自のステータスコードを作成する場合は、FACILITY_ITF を使用してください。その他の機能コードは、Microsoft* によって予約されています。
下位 16 ビット (最下位ワード) には、発生したエラー固有のエラーコードが含まれています。
一般的な HRESULT エラー値は、0x80070057 のようになります。最初の 16 進数である 8 は、ビット 31 が設定され、エラー値であることを示します。ビット 16 からビット 27 の値は 7 です。これは、FACILITY_WIN32 の機能コードです。最下位ワードの値は 0057 です。これは、E_INVALIDARG エラーの固有コードです。
システムの HRESULT 値に対応する説明を表示するには、インテル® Fortran プログラムフォルダーにある Error Lookup ツールを使用します。例えば、次のように、0x80070057 という値を入力すると、"The parameter is incorrect (引数が間違っています)" というメッセージが表示されます。
\VC\INCLUDE ディレクトリーにある WINERROR.H ファイルで HRESULT 値を検索することもできます。
Visual Basic* のオブジェクトを使用する場合は、Visual Basic* プロジェクトにオブジェクトへの参照を追加する必要があります。[プロジェクト] メニューから [参照の追加] を選択して、登録されたオブジェクトのリストを表示します。リストからオブジェクトを選択して、Visual Basic* にオブジェクトの使用を知らせます。
Visual Basic* クライアントとともに使用するサーバーでは、次の点を考慮する必要があります。
オートメーション互換データ型のみ使用します (「メソッドおよびプロパティーのデータ型」を参照)。
メソッドへの引数は、ByVal または ByRef として渡すか、関数の戻り値を渡します。
ByVal として渡す引数は、[Intent (インテント)] を [in] に設定する必要があります。
ByRef として渡す引数は、[Intent (インテント)] を [in,out] に設定する必要があります。
関数の戻り値は、[Intent (インテント)] を [out] に設定する必要があります。[Return Value (戻り値)] フィールドをオンにする必要があります。引数は、メソッドの最後の引数でなければなりません。
配列は、常に SafeArray ByRef として渡されます。このため、[Intent (インテント)] を [in,out] に設定する必要があります。
Visual Basic* のブール型の引数を使用する場合は、[Fortran Type (Fortran 型)] を LOGICAL(2) に、[IDL Type (IDL 型)] を VARIANT_BOOL に設定します。
C++ のオブジェクトを使用する場合は、#import ディレクティブを使用します。#import ディレクティブの構文は次のとおりです。
#import "filename" [attributes] #import <filename> [attributes]
filename は、タイプ・ライブラリーの情報が含まれたファイルの名前です。ディレクティブにより、ソースファイルでタイプ・ライブラリーの情報を C++ クラスのセットとして利用できるようになります。