この節では,Fortran COM サーバーをデザインする時に考察しなければならない情報を提供しています。以下のトピックがあります。
COM は,COM メソッドとプロパティで使用するデータ型に制限を設けています。制限を設けている理由は,COM が引数をスレッド,手続,およびマシン間で渡すことができるようにするためです。これは,呼び出し側と同じアドレス空間で常に動作する DLL のような古い技術には存在しない問題を引き起こします。
COM は,オートメーション互換データ型と呼ばれるデータ型の組を定義しています。これらは,オートメーションとデュアル・インタフェースで使われるデータ型のみです。これらのデータ型に COM インタフェースを制限することの利点が 2 つあります。
サーバーは,Visual Fortran,Visual Basic,および Visual C++ を含む様々な言語で書かれたクライアントから利用することができます。
COM は自動的に,スレッド,手続,およびマシン間の引数渡しを処理します。詳細は,「COM サーバーの詳細説明」の「マーシャリング,プロキシ,およびスタブ」を参照してください。
サーバーをオートメーション互換データ型に制限するには,以下のようにします。
「Interface property」ページの「Use only Automation data types」を選択します。デュアル・インタフェースを定義する場合,これは自動的に設定されます。
「Argument property」ページの「Fortran data type」と「Interface data type」の以下の組み合わせのみを使用します。
Visual Fortran は,オートメーション互換データ型として,「Currency」,「Decimal」,または「User Defined Type」をサポートしていないことに注意してください。
Fortran Date Type | Interface Data Type |
---|---|
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 の 1 つを含みます) |
自分のインタフェースをオートメーション互換データ型に制限しないとした場合,次のアプローチは,Interface Description Language (IDL) に記述できるデータ型に対するインタフェースを制限させます。
Fortran COM Server Wizard は,自動的にサーバーの記述から 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 に対応するテキスト記述を参照するには,「Compaq Visual Fortran」プログラム・フォルダの「Error Lookup」ツールを使用します。たとえば,値 0x80070057 を入力すると,以下に示すようにテキスト・メッセージ「The parameter is incorrect」が取り出されます。
Visual Fortran CD-ROM の \VC\INCLUDE ディレクトリの WINERROR.H で HRESULT 値を検索することもできます。
COM サーバーはまた,ErrorInfo オブジェクトを通して拡張エラー情報を提供することもできます。詳細は,「COM ErrorInfo オブジェクトに対するサポートの追加」を参照してください。
Visual Basic と Visual C++ クライアントの注意事項
Visual Basic からオブジェクトを使用するためには,Visual Basic プロジェクトにオブジェクトの「参照 (Reference)」を追加しなければなりません。「プロジェクト」メニューの「参照設定」を選択して,登録されているオブジェクトの一覧を表示します。一覧からオブジェクトを選択して,Visual Basic に使用するオブジェクトを伝えます。
Visual Basic クライアントが使用するサーバーを書く時に注意しなければならない点を説明します。
オートメーション互換データ型のみを使用します (「メソッドとプロパティのデータ型 を参照)。
メソッドへの引数は,ByVal,ByRef で渡すか,関数返し値です。
ByVal で渡す引数は,「Intent」を「In」にして定義されなければなりません。
ByRef で渡す引数は,「Intent」を「InOut」にして定義されなければなりません。
関数返し値は,「Intent」を「Out」にして定義されなければなりません。「Return Value」欄がチェックされていなければなりません。引数は,メソッドの最後の引数でなければなりません。
配列は,常に SafeArray ByRef で渡されなければなりません。そのため,それは「Intent」を「InOut」にして定義されなければなりません。
Visual Basic の Booolean データ型の引数を使用するには,「Fortran data type」を「LOGICAL(2)」に設定し,「Interface data type」を「VARIANT_BOOL」に設定します。
Visual C++ からオブジェクトを使用するには,#import 指示文を使用します。#import 指示文の構文は,以下のようになります。
#import "filename" [attributes] #import <filename> [attributes]
filename は,タイプ・ライブラリー情報を含むファイルの名前です。指示文は,C++ クラスの組としてソース・ファイルに対してタイプ・ライブラリーを利用可能にする情報を作成します。詳細は,Visual C++ マニュアルを参照してください。