この節は,プロジェクトの作成,COM サーバーの特徴の指定,コードの生成,および Adder と呼ばれる Fortran COM Server プロジェクトの例の実装について説明します。この節には,以下のトピックがあります。
Developer Studio Add-in としての Fortran COM Server の指定
Fortran COM Server Wizard は,Developer Studio Add-in として実装されています。Visual Fortran をインストール後,自分のシステムに Fortran COM Server Wizard を登録し,ロードする必要があります。まだそれを行っていない場合,以下のようにしてください。
「Tools」メニューで「Customize」をクリックします。
「Add-ins and Macro Files」タブをクリックします。
一覧中に「Fortran COM Server Wizard」が表示されていれば,「Fortran COM Server Wizard」のチェックボックスをクリックします。
表示されていなければ,「Browse」ボタンをクリックして,...\Microsoft Visual Studio\Common\MSDev98\Addins\Df98\ ディレクトリにある CSAddin.dll ファイルを探します。
「Close」ボタンをクリックします。
自分のシステムで 1 度だけこの手続を実行します。
Fortran COM Server を作成する第 1 ステップは,新しいプロジェクトを作成することです。Developer Studio を起動します。「File」メニューから「New」をクリックします。
「New」ダイアログボックスで,下図のように「Fortran COM Server」プロジェクト・タイプを選択 (クリック) します (Microsoft Visual C++ がインストールされているシステムでは,これ以上のプロジェクト・タイプが表示されます)。
Fortran COM Server Wizard は,Developer Studio Add-in として実装されており,自分のシステムに登録され,ロードされていなければなりません。「The Fortran COM Server Wizard Add-in is not loaded into Developer Studio ...」で始まるメッセージを受領した場合,「Developer Studio Add-in としての Fortran COM Server の指定」の説明に従ってください。
この例の場合:
プロジェクトの名前として Adder を入力します。
表示されているプロジェクト・フォルダ位置をそのまま使うか,変更します。
「OK」ボタンをクリックします。(「<Back」ボタンをクリックすると,前に表示された画面に戻り,プロジェクト名,場所,プロジェクト・タイプを変更することができます。)
作成される Fortran COM Server プロジェクトの初期属性を定義するには,付加的な情報が要求されます。次図は,Fortran COM Server AppWizard を示しています。(他のプロジェクト・タイプと同様に) プロジェクト・ファイルおよび骨格テンプレートを作成するためにプロジェクト単位にプロジェクトの AppWizard を使用します。Fortran COM Server AppWizard は,サーバー・タイプ (DLL または EXE),クラス名,インタフェース名,およびクラス構造体名を要求します。
この例の場合:
基本サーバー・タイプ (DLL) をそのまま使用します。
クラス名として AddingMachine をタイプします。基本インタフェース名と基本クラス構造型名として基本テキストが表示されます。
基本インタフェース名を IAdd に変更します。
基本クラス構造体名はそのまま使用します。
「Finish」ボタンをクリックします。(「Cancel」をクリックすると,プロジェクト作成が終了します。)
このプロジェクトに対して作成された位置,テンプレート情報をまとめた「New Prioject Information」画面が表示されます。
「OK」をクリックした後,プロジェクトが作成され,Fortran COM Server Wizard が表示されます。
COM サーバーを定義するための Fortran COM Server Wizard の使用
Fortran COM Server Wizard は,COM サーバーの属性を会話形式で定義します。クラス,インタフェース,メソッドなどを定義したり,名前をつけたりすることができます。ユーザー・インタフェースには 2 つのペインがあります。
左ペインは,クラス,インタフェース,メソッドなどを階層的に表示するツリー・コントロールです。
右ペインは,階層中で選択した要素のプロパティを表示するプロパティ・ページです。
Fortran COM Server Wizard は,Fortran COM Server AppWizard から自動的に呼び出されます。そのため,サーバーの初期定義を入力することができます。この時点で完全なサーバーを定義することもできますが,必ず定義しなければならないということはありません。プロジェクトを部分的に定義し,プロジェクト・ワークスペースを閉じることができます。後で,Developer Studio を起動し,プロジェクト・ワークスペースを開いた後,「View」メニューから「Fortran COM Server Wizard」メニューを選択して Fortran COM Server Wizard を起動することができます。
COM サーバーの例では,Fortran COM Server Wizard の初期画面が表示され,タイプ・ライブラリーの GUID とタイプ・ライブラリーのバージョンを表示しています。
この場合,IAdd インタフェース名を選択するために階層を拡張する必要があります。以下のようにします。
COM サーバー名 (およびプロジェクト名) Adder を開くためにプラス記号 (+) をクリックします。
クラス名 AddingMachine を開くためにプラス記号 (+) をクリックします。
インタフェース名 IAdd をクリックします。
次図のような画面が表示されます。
「Dual Interface」チェックボックスにチェックがある場合,「Dual Interface」をクリックしてチェックを取り除きます。Adder 例は,COM サーバー・インタフェースのみをサポートしています。
階層は,以下のようになります。
ルートは,COM サーバー自身 Adder です。これはまた,プロジェクト名でもあります。
COM サーバーの直下の子は,クラスです。この例の階層は,初期値として単一クラス AddingMachine を含んでいます。COM サーバーに他のクラスを追加することができます。
クラスの直下の子は,インタフェースとクラス構造体です。この例の階層は,インタフェース IAdd とクラス構造体 AddingMachine_InstanceData を含んでいます。各クラスは,1 つのみのクラス構造体を含んでいます。クラスに別のインタフェースを追加することができます。
インタフェースの直下の子は,メソッド (1 つ以上) です。
メソッドの直下の子は,メソッド引数 (1 つ以上) です。
クラス,インタフェース,メソッド,プロパティまたは引数を追加するための Fortran COM Server Wizard グラフィカル・ユーザー・インタフェースの使用方法
親の項目を選択します。
「Add」ボタンをクリックします。
要求する名前 (および他の要求するテキスト) をタイプします。
「OK」をクリックします。
項目を削除する方法
削除したい項目を選択します。
「Delete」ボタンをクリックします。
Adder COM サーバーの例に対して,IAdd インタフェースにメソッドを追加します。
IAdd インタフェースが選択 (強調表示) されていることを確認します。
「New」ボタンをクリックします。
次図が表示されます。
表示される活動状態ボタンは,階層で選択 (強調表示) された項目 (COM サーバー,クラス,インタフェース,メソッド,または引数) に依存します。活動状態ボタンは,現在のコンテキストで有効なタイプを表わします。たとえば,「Argument」ボタンは,インタフェースが選択されているので,活動状態ではありません。引数はメソッドに追加されなければなりません。
この例の場合:
「Method」タイプを選択します。
IAdd インタフェースの第 1 メソッドの名前として Clear をタイプします。
「OK」をクリックします。
Clear メソッドが引数を取らないため,Add という名前の第 2 メソッドを追加することができます。
IAdd インタフェースをクリック (選択) します。
「New」ボタンをクリックします。
第 2 メソッド名として Add をタイプします。
「OK」をクリックします。
Add メソッドは,引数を要求します。Operand という名前を引数につけます。Operand 引数を追加するには,以下のようにします。
Add メソッドをクリック (選択) します。
「New」ボタンをクリックします。
引数名として Operand をタイプします。
「OK」をクリックします。
「OK」をクリックする前に,以下の画面が表示されます。
「OK」をクリックすると,Fortran COM Server Wizard は Operand 引数を追加し,そのプロパティを表示します。
引数の基本データ型は,INTEGER(4) です。
この例の場合:
データ型を REAL(4) に変更するために「Fortran data type」コンボボックスを使用します (以下のようにします)。
「Interface data type」と「Intent」は基本値のままにしておきます。
最後のメソッドを追加します。
IAdd インタフェースをクリック (選択) します。
「New」ボタンをクリックします。
メソッド名として GetValue をタイプします。
「OK」をクリックします。
GetValue メソッドは,引数を要求します。引数に CurrentValue という名前をつけます。CurrentValue 引数を追加するには,以下のようにします。
GetValue メソッドを選択します。
「New」ボタンをクリックします。
引数名として CurrentValue をタイプします。
「OK」をクリックします。
CurrentValue に対して,以下の設定を行います。
データ型を REAL(4) に変更するため「Fortran data type」コンボボックスを使用します。
「Interface data type」を基本値のままにしておきます。
「Intent」を「Out」に変更します。
「Return Value」チェックボックスをクリックします。
次図が表示されます。
この例では,サーバー定義が今終了しました。「Save」ボタンをクリックして,Fortran COM Server Wizard を終了します。TODO.TXT ファイルを含む生成したコードの修正を可能にするために,プロジェクトが開かれます。
サーバー,クラス,インタフェース,メソッド,引数,またはインスタンス・プロパティに対するプロパティ・ページ (右ペイン) についての詳細は,「プロパティ・ページの記述」を参照してください。
後でサーバーの定義を変更するには,「View」メニューの「Fortran COM Server Wizard」を選択します。
メソッドに加えて,インタフェースはプロパティを含んでいます。プロパティは,オブジェクトの状態に関する情報を設定するまたは返すメソッドの組です。一般的に,プロパティはオブジェクトの構造体の欄に対応しています。たとえば,AddingMachine の例では,GetValue (および SetValue) メソッドよりは CurrentValue プロパティを使用します。
プロパティは,主にオートメーションの概念です。COM インタフェースでは,プロパティは 1 つまたは 2 つのメソッドとして実装されています。
get_property-name メソッド
put_property-name メソッド
プロパティは,読み取り専用または書き込み専用として定義することができます。この場合,1 つの get_ または put_ メソッドのみになります。
メソッドよりもプロパティとしてインタフェース・メンバを定義することは,サーバーのクライアントが使用する構文に影響します。たとえば,Visual Basic は,メソッドを呼び出す構文とは異なったプロパティの取り出し,書き込み構文を使用します。クライアント言語が特有のプロパティ構文を持っている場合,一般的に,呼び出しよりもむしろ記録の欄の設定によく似ています。
インタフェースにプロパティを追加する方法
階層ペインのインタフェースをクリック (選択) します。
「New」ボタンをクリックします。「New」ダイアログボックスが表示されます。以下の作業を行います。
プロパティ・タイプを選択します。
プロパティ名をタイプします。以下の画面が表示されています。
「OK」をクリックします。以下の画面が表示されます。
「New Property」ダイアログボックスで,プロパティの属性を定義します。これには,以下が含まれます。
プロパティが get_ と put_ メソッドの両方を持つかどうかを決定します。
プロパティの整数オートメーション識別子を入力します。
プロパティのデータ型を決定します。
「OK」をクリックします。
1 つまたは 2 つのメソッドをインタフェースに追加することができます。get_ と put_ メソッドの両方を選択すると,2 つのメソッドが追加されます。それが読み取り専用または書き込み専用の場合, 1 つのメソッドが追加されます。プロパティ・メソッドとプロパティ値を識別する引数は,完全に定義され,修正する必要はありません。
一般に,プロパティ・メソッドは,プロパティ値を表わす単一引数のみを持ちます。意味があれば,別の引数を追加することができます。たとえば,プロパティが値の配列で,整数指標引数がプロパティ・メソッドに追加される場合には,別の引数が追加されるかもしれません。
別の引数をプロパティ・メソッドに追加する時,プロパティ値引数の前にそれらが追加されていることを確認してください。つまり,プロパティ値引数は,常にプロパティ・メソッドの最後の引数でなければなりません。引数の順番を変更するには,階層ペインでドラッグ・アンド・ドロップを使用します。メソッド中の順番は,常に階層ペインでの出現順になります。
AddingMachine の例で見たように,階層ペインはサーバー,つまり,クラス,インタフェース,メソッドなどの定義を表わします。階層ペインのユーザー・インタフェースは,以下の機能をサポートしています。
領域の拡張/短縮 | Fortran COM Server Wizard が最初に表示されるとき,階層は完全に短縮されています。項目の子を表示するには,項目の横のプラス記号 (+) をクリックします。この時点で,プラス記号 (+) はマイナス記号 (-) に代わります。子を隠すにはマイナス記号 (-) をクリックします。項目でダブルクリックすることによっても,拡張/短縮状態の切り替えを行うことができます。 |
新しいエントリの追加 | 階層に新しいエントリを追加するには,階層中の新しいエントリの前のエントリを選択します。「New...」ボタンをクリックするか,階層ペインのポップアップ・コンテンツ・メニューを表示するために,右マウス・ボタンをクリックして,コンテンツ・メニューの「New...」エントリの 1 つを選択します。 |
エントリの削除 | 階層からエントリを削除するには,削除したい項目を選択します。「Delete」ボタンをクリックするか,階層ペインのポップアップ・コンテンツ・メニューを表示するために,右マウス・ボタンをクリックして,コンテンツ・メニューの「Delete」エントリを選択します。確認ダイアログボックスが表示され,選択したエントリを削除するかどうかの確認を行います。項目が削除されると,項目の全ての子は,削除されます。 |
メンバ名の変更 | 階層のエントリの名前を変更するには,名前を変更したい項目を選択します。数秒待って (ダブルクリックとの混乱を避けるため),もう一度項目をクリックします。名前を変更できるように項目名がエディット・モードになります。名前の編集が終了すると,Enter を押します。 |
項目の順番の変更 | 階層のエントリの順番は,大変重要です。特に以下のものが重要です。
|
階層ペインは,項目の順番を変更できるように,ドラッグ・アンド・ドロップをサポートしています。項目を移動するには,項目をクリックしドラッグして,階層中の起きたい場所の項目にドロップします。
プロパティ・ページは,Fortran COM Server Wizard ウィンドウの右ペインに表示されます。以下の異なったプロパティ・ページに適用されます。
Type Library GUID | サーバーのタイプ・ライブラリーのユニークな識別子です。Fortran COM Server Wizard が生成した基本値からこれを変更する理由は一般にはありません。 |
Type Library Version | タイプ・ライブラリーの現在のバージョンです。 |
ProgID | クラスに対するプログラム ID (またはテキスト別名) に独立したバージョンです。ProgID は,COMCreateObjectByProgID のような呼び出しで使用することができます。 |
Version | クラスの現在のバージョンです。バージョン特有の ProgID を定義するために ProgID に追加されます。 |
Short name | クラスの短縮名です。生成したファイル名に使用されます。 |
Description | レジストリのクラスの ProgID キーの基本値として使用される文字列です。この文字列は,システムに登録されているオブジェクトの一覧を表示する「OLE-COM Object Viewer」のようなツールでよく使用されます。 |
Help String | IDL ファイル中のクラスのヘルプ文字列属性を設定するための文字列です。 |
Threading model | クラスのスレッド化モデルです。2 つの選択肢は「Apartment」と「Single」です。この選択肢の実装についての詳細は,「COM サーバーの詳細説明」の「スレッド化モデル」を参照してください。 |
CLSID | クラスのユニークな識別子です。Fortran COM Server Wizard が生成した基本値からこれを変更する理由が一般にはありません。 |
Dual Interface | チェックされていると,デュアル・インタフェース属性が IDL ファイルに設定されます。デュアル・インタフェースは,COM とオートメーション・クライアントの両方をサポートします。 |
Uses only Automation data types | チェックされていると,インタフェースは,「メソッドとプロパティのデータ型」で説明しているオートメーション互換データ型のみを使用します。 |
Default interface | チェックされていると,基本インタフェース属性が IDL ファイルのこのインタフェースに設定されます。基本属性は,オブジェクトの基本プログラム可能インタフェースを表わし,マクロ言語でよく使われます。 |
Help String | IDL ファイルのインタフェースのヘルプ文字列属性を設定するために使用する文字列です。 |
IID | インタフェースのユニークな識別子です。Fortran COM Server Wizard が生成した基本値からこれを変更する理由が一般にはありません。 |
ID | オートメーション・クライアントが使用するメソッドの識別子です。 |
Help string | IDL ファイルのメソッドのヘルプ文字列属性を設定するために使用する文字列です。 |
Property Method | チェックされていると,メソッドはプロパティの get_ または put_ メソッドです。 |
Fortran data type | 引数の Fortran データ型です。一覧からデータ型の 1 つを選択するか,データ型をタイプします。選択肢の実装については,「メソッドとプロパティのデータ型」を参照してください。 |
Interface data type | IDL データ型です。既定の一覧から Fortran データ型の 1 つを選択すると,この欄は対応する IDL データ型に基本値が変わります。一覧からデータ型の 1 つを選択するか,データ型をタイプします。選択肢の実装については,「メソッドとプロパティのデータ型」を参照してください。 |
Intent | 引数の INTENT は,以下の一覧の 1 つです。
|
By Reference | 引数が値渡しではなく参照渡しで渡されることを示します。「Intent In」の時のみ有効です。「Intent Out」および「Intent InOut」の時には,自動的に参照渡しになります。 |
Return Value | チェックされていると,引数はメソッドの返り値を表わします。「Intent Out」の時のみ有効です。 |
Array argument | チェックされていると,引数はスカラ引数ではなく配列になります。チェックすると,配列の形状を記述する「Array Description」の欄を埋めなければなりません。 |
Optional argument | チェックされていると,引数は省略可能になります。省略可能引数は,Variant データ型を使って渡されます。 |
Array Description 欄 | これらの欄は,配列引数の形状を記述します。「Array arugment」がチェックされている時のみ活動状態になります。 |
Module | UclassnameTY.f90 ファイルに定義されるモジュールの名前として使用されます。 |
Constructor | UclassnameTY.f90 ファイルに定義されるクラス・コンストラクタの名前として使用されます。 |
Destructor | UclassnameTY.f90 ファイルに定義されるクラス・デストラクタの名前として使用されます。 |
Fortran COM Server Wizard を終了するために「Save」ボタンをクリックするか,プロジェクト・ワークスペースを開いた後,TODO.TXT ファイルを含んだプロジェクトが表示されます。
TODO.TXT ファイルは,Fortran COM Server Wizard がプロジェクトに加えた修正の情報を示し,変更を加える必要があるときを知らせます。Fortran COM Server Wizard を始めて呼び出した後,TODO.TXT ファイルはプロジェクトに追加されたファイルの一覧を示します。ソース・ファイルは,「FileView」ペインの 2 つのフォルダに追加されます。
修正しなければならないソース・ファイルは,「Source Files」フォルダに置かれています。
Fortran COM Server Wizard が完全に作成したファイルは,「Do Not Edit」フォルダに置かれています。このフォルダのファイルは,Fortran COM Server Wizard が呼び出される毎に生成され,サーバーの定義が変更されるので,このフォルダのファイルを修正することは無意味です (修正内容が失われます)。
以下をクリックします。
Addr ファイル行のプラス記号 (+)
「Source Files」フォルダのプラス記号 (+)
プロジェクト画面が以下のように表示されます。
「Source Files」フォルダ中の 2 ファイルをテキスト・エディタで編集する必要があります。
UAddingMachineTY.f90 は,クラス構造型を定義するモジュールを含んでいます。
UIAdd.f90 は,IAdd メソッドの実装を含んでいます。
ファイル UAddingMachineTY.f90 をまず修正します。ファイル UAddingMachineTY.f90 を修正するには,「FileView」ペインのこのファイル名をダブルクリックするか,「File」メニューの「Open」を使用します。元ファイル UAddingMachineTY.f90 には以下のコードが含まれています。
Uclass-nameTY.f90 という名前のファイルは,サーバーが定義する各クラスに対して作成されます。ファイルは,AddingMachine_USE と名前の付いたモジュール (classname_USE という形式で) を含んでいます。自分のクラスに特有なコードを追加する必要のある場所がこのモジュールに 3 個所あります。
モジュールの第 1 エントリは,クラス構造型です。これは,最初,モジュールがエラーなくコンパイルできるように "integer dummy" 欄を含んでいます。クラスがオブジェクト毎にデータを持つ場合,"integer dummy" 欄行を削除し,構造型に自分のデータを追加します。AddingMachine クラスに対して,オブジェクトが現在値を保存する以下の場所を追加します。
real(4) CurrentValue
モジュールはまた,名前 AddingMachine_CONSTRUCTOR と AddingMachine_DESTRUCTOR の 2 つのモジュール手続を含んでいます (classname_CONSTRUCTOR と classname_DESTRUCTOR として参照されます)。
classname_CONSTRUCTOR 手続は,新しいオブジェクトの生成であるため,クラス構造型のインスタンスが生成された後に,直ちに呼び出されます。この関数は,必要であれば,クラス構造型の欄を初期化する場所に置きます。新しい構造型は,関数に引数として渡されます。AddingMachine クラスに対して,以下の文を追加することで,現在値を 0 に初期化します。
ObjectData%CurrentValue = 0
classname_DESTRUCTOR 手続は,オブジェクトが破壊されるため,クラス構造型のインスタンスが破壊される前に,直ちに呼び出されます。この関数は,必要であれば,クラス構造型の欄が使用するリソースを開放する場所に置きます。AddingMachine に対して,何も加えるものがありません。
他のソース・ファイル UIAdd.f90 を修正します。「FileView」ペインのこのファイル名をダブルクリックするか,「File」メニューの「Open」を選択します。元ファイル UIAdd.f90 には,以下のコードが含まれます。
名前 Uinterfacename.f90 を持つファイル (たとえば,UIadd.f90) は,クラスが定義するインタフェース毎に作成されます。ファイルは,クラスのメソッドを含んでいます。各メソッドは,interfacename_methodname という名前が付けられています。たとえば,"IAdd_Clear" です。各メソッドは,第 1 引数としてクラス構造型を渡す関数です。これは,オブジェクト毎のデータを参照する関数に与えます。各関数は,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
ファイルを保存し,「Build」メニューから「Build Adder.dll」をクリックしてサーバーをビルドします。これで,COM サーバーが作成されました。
Fortran AppWizard が生成する Developer Studio プロジェクトは,一般的な Fortran プロジェクトでは行われない 2 つの追加ステップを実行します。
ビルドは,サーバーを記述する IDL ファイルをコンパイルするために MIDL コンパイラを使用します。MIDL コンパイラは,サーバーのタイプ・ライブラリーを作成し,MIDL ベースのマーシャリング (「マーシャリング,プロキシ,およびスタブ」を参照) に使用することができる C ファイルを生成します。
MIDL コンパイラは,基本設定ではコンパイル中に Visual C++ プリプロセッサーを使用します。AppWizard が Visual C++ がインストールされていないと判断した場合,代わりに Fortran プリプロセッサー FPP を使うように MIDL オプションを設定します。追加されるオプションは,以下のとおりです。
/cpp_cmdfpp /cpp_opt "/a /m/extend_source 132"
カスタム・ビルド・ステップは,システムの COM サーバーを登録するために追加されます。DLL COM サーバーに対して,登録は REGSVR32 プログラムを使用して行われます。Developer Studio の実行形式ファイル一覧に Windows システム・ディレクトリがない場合,REGSVR32 は失敗します。Windows NT, Windows XP と Windows 2000 システムでは,これは \Winnt\System32 です。Windows 9x と Me システムでは,これは一般的に \Windows\System です。登録ステップが失敗した場合,以下のことを行います。
「Tools」メニューで「Options」をクリックします。
「Directories」タブにスクロールします。
一覧から「Executable files」を選択します。
ディレクトリ一覧の最後に Windows システム・ディレクトリを追加します。
「OK」をクリックします。
EXE COM サーバーに対して,COM サーバー自身は /REGSERVER コマンド行オプションで実行されます。
システムに Microsoft Visual C++ バージョン 6 もインストールしている場合,サーバー定義が「Visual C++ ClassView」ペインにも表示されます。これは,Fortran COM Server Wizard が作成した IDL ファイルを「Visual C++ ClassView」ソフトウェアが読むことができ,理解することができるために発生します。
サーバーは,これで COM クライアントから呼び出せるようになりました。完全な Adder サンプルは,...Df98\Samples\Advanced\COM\Adder ディレクトリに提供されています。このディレクトリには,Visual Fortran,Visual Basic,および Visual C++ で書かれた 3 つのクライアントが含まれています。
サンプル・クライアントをビルドするには,まず,Adder サンプルをビルドします。サンプル COM クライアントが使用する GUID は,Adder サンプル (このサンプルで作成された GUID ではない) と一緒に動作します。
この節の始めの (「Fortran COM Server プロジェクトの作成」から始まる) COM サーバー AddingMachine の例に従っている場合,作成した AddingMachine は AddingMachine オブジェクトに割り付けされた GUID を除いて Adder サンプルと同じものです。Fortran COM Server AppWizard は常に,新しいプロジェクトに対して新しい GUID を生成します。
各クライアントは,AddingMachine に対するユーザー・インタフェースを提供するダイアログボックスを表示します。以下では,クライアントの各々についての注意事項を説明しています。
VFAdder:Visual Fortran クライアント
VFAdder クライアントは,Fortran Windows Application AppWizard を使って作成されています。VFAdder は,簡単なダイアログを基本としたアプリケーションです。主ダイアログボックスは,「Clear」と「Add」ボタン,「addednd」を入力するためのエディットボックス,および現在値を表示するスタティックテキスト・フィールドを持つように定義されています。
Fortran Module Wizard は,Fortran から使用するための IAdd インタフェース・メソッドを定義するモジュール (AddingMachine.f90) を作成します。COM を初期化し AddingMachine オブジェクトを作成するためのコードが WinMain ルーチンの最初に追加されています。
call COMINITIALIZE(ret) call COMCREATEOBJECTBYGUID (CLSID_AddingMachine, CLSCTX_ALL, IID_IAdd, & & gAddingMachine, status) call Check_Status(status, " Unable to create AddingMachine object")
「Add」ボタン (VFAdderAdd) のハンドラとして追加されているサブルーチンは,$IAdd_Add ルーチンと $IAdd_GetValue ルーチンを呼び出します。
! AddingMachine Add メソッドを呼び出します lret = DlgGet(dlg, IDC_EDIT_ADDEND, text) read(text, *) addend status = $IAdd_Add(gAddingMachine, addend) call Check_Status(status, " Add method returned failure status") ! テキスト・フィールドに現在値を設定します status = $IAdd_GetValue(gAddingMachine, value) write(text, *) value call Check_Status(status, " GetValue method returned failure status") lret = DlgSet(dlg, IDC_CURRENTVALUE, text)
「Clear」ボタン (VFAdderClear) のハンドラとして追加されたサブルーチンは,$IAdd_Clear を同じ方法で呼び出します。COM の初期化解除し,AddingMachine オブジェクトを開放するコードは,WinMain ルーチンの最後に追加されます。
if (gAddingMachine /= NULL) then ret = COMReleaseObject(gAddingMachine) endif call COMUNINITIALIZE()
VBAdder:Visual Basic V6 クライアント
VBAdder は,新規の「標準 EXE」プロジェクトから作成されています。フォームは,上述の VFAdder ダイアログボックスと同じように修正されています。Visual Basic から AddingMachine オブジェクトを使用する第 1 ステップは,「プロジェクト」メニューから「参照設定」メニュー項目を選択することです。一覧から「AddingMachine 1.0 Type Library」を検索し,選択します。Visual Basic は,タイプ・ライブラリーから情報を読み取り,AddingMachine オブジェクト,IAdd インタフェース,およびそのメソッドを認知します。これらは,Visual Basic エディタがプロジェクトにコードを入力できるようにする選択肢に現れます。
以下のコードが VBAdder プロジェクトに追加されます。
AddingMachine オブジェクトのインスタンスは,「General Declarations」領域に以下の行を追加することで作成されます。
Dim Adder As New AddingMachine
「Add」ボタンがクリックされた時のメソッドに対するコードは,以下のようになります。
Private Sub Add_Click() Dim Value As Single Adder.Add (Addend.Text) CurrentValue.Caption = Adder.GetValue Addend.Text = "" End Sub
「Clear」ボタンがクリックされた時のメソッドに対するコードは,以下のようになります。
Private Sub Clear_Click() Adder.Clear CurrentValue.Caption = Adder.GetValue End Sub
「Exit」ボタンがクリックされた時のメソッドに対するコードは,以下のようになります。
Private Sub Exit_Click() End End Sub
VCAdder:Visual C++ V6 クライアント
VCAdder は,「MFC AppWizard (exe)」で作成されます。「ダイアログベース」オプションをウィザードで選択します。ダイアログボックス・コントロールは,VFAdder ダイアログボックスからコピーし,VCAdder ダイアログボックスに貼り付けます。
以下の文は,AddingMachine オブジェクト,IAdd インタフェースおよびそのメソッドをソース・ファイルが参照できるように VCAdder.h に追加されます。
#import "..\Adder.dll"
メンバ変数は,AddingMachine オブジェクトにポインタを保持するために,CVCAdderApp アプリケーション・クラスに追加されます。
AddingMachineLib::IAddPtr m_pIAdd;
以下のコードは,COM を初期化し,AddingMachine オブジェクトを作成するために CVCAdderApp::InitInstance メソッドの先頭に追加されます。
CoInitialize(NULL); m_pIAdd.CreateInstance(__uuidof(AddingMachineLib::AddingMachine));
MFC Class Wizard は,以下を追加するために使用されます。
「Addend」エディット欄のメンバ変数:m_Addend
「CurrentValue」スタティックテキスト欄のメンバ変数:m_CurrentValue
「Add」,「Clear」,および「Exit」ボタンのクリックされた時のメッセージに対するメンバ関数:OnAdd,OnClear,および OnExit
OnAdd は,Add メソッドと GetValue メソッドを呼び出します。
void CVCAdderDlg::OnAdd() { HRESULT hr; UpdateData(); double addend = atof(m_Addend); hr = theApp.m_pIAdd->Add((float)addend); float value = theApp.m_pIAdd->GetValue(); char buffer[32]; sprintf(buffer, "%10.10G", value); m_CurrentValue = buffer; m_Addend = ""; UpdateData(FALSE); }
OnClear は,Clear メソッドと GetValue メソッドを同じ方法で呼び出します。
以下のコードは,AddingMachine オブジェクトを開放し,COM の初期化解除するために CVCAdderApp::InitInstance メソッドの最後に追加されます。
m_pIAdd.Release(); CoUninitialize();
Visual Basic と Visual C++ クライアントを使用する上でのデザイン考察と注意事項については,「Visual Basic と Visual C++ クライアントの注意事項」を参照してください。
階層中のエントリのプロパティを変更するため,階層に新しいエントリを追加するため,階層中のエントリを移動するため,または,階層からエントリを削除するために,サーバーを修正することができます。
COM サーバー定義への追加,削除,または変更を簡単に行うため,COM サーバーを作成する時に使用した Fortran COM Server Wizard の同じユーザー・インタフェースを使用します。しかしながら,COM サーバー定義を変更する際には,以下のファイルには注意が必要です。
TODO.TXT を参照してください。TODO.TXT は,サーバー定義に対して行った変更のログが提供されています。使用しなくなったエントリは,TODO.TXT から削除してください。TODO.TXT は,ウィザードがメッセージを追加する単純なテキスト・ファイルです。
Fortran COM Server Wizard が生成した「Source Files」フォルダ中のソース・ファイルの新バージョンは,既存のソース・ファイルを上書きしません。これは,既存のソース・ファイルが修正されているかもしれないからです。新しいソース・ファイルは,元のソース・ファイル名にプラス記号 (+) をつけた物になります。たとえば,UIADD+.f90 です。TODO.TXT ファイルのテキストの説明にしたがって,テキスト・エディタを使って,前に修正したソース・コードに新たに作成した定義をカット・アンド・ペーストします (以下を参照)。
サーバー定義が変更されると,必ず Fortran COM Server Wizard は「Do Not Edit」フォルダのファイルを再作成します。
Fortran COM Server Wizard を表示するには,以下のようにします。
Developer Studio を起動します。
Fortran COM Server AppWizard で作成した COM サーバー・プロジェクトを開きます。
「View」メニューから「Fortran COM Server Wizard」をクリックします (COM サーバーを定義するための Fortran COM Server Wizard の使用 を参照)。
一度,インタフェースを公開しクライアントがそれを使用すると,インタフェースを変更してはならないという COM 規則が適用されます。その代わり,元のインタフェースに加えて,新しいインタフェースを作成し,名前を変更します。一般的には,インタフェースの 2 番目のバージョンに対して,名前の後に 2 を追加します。たとえば,IAdd を IAdd2 とします。クラスの第 2 番目のバージョンは,元のインタフェースと新しいインタフェースの両方をサポートすべきです。新しいクライアントは,新しい機能を持つ新しいインタフェースを使うことができます。
新しいインタフェースは,元のインタフェースとは異なったインタフェース ID (IID) を持っています。IID は,プログラマの利便性を考えて,テキスト名になっています。IID は,インタフェースをユニークに識別します。
Fortran COM Server Wizard がプロジェクトに変更を加えた場合や複数のソース・ファイルを手動で修正することが必要になるサーバー定義の変更を行った場合には,いつでも Fortran COM Server Wizard は TODO.TXT にメッセージを書き込みます。たとえば,IAdd インタフェースに現在値を特定の数字に設定する新しいメソッド SetValue を追加した場合,ウィザードはサーバーに新しいメソッドを実装する新しいコードを生成します。新しいコードの幾つかは,「Do Not Edit」フォルダ中のファイルに書き込まれます。ウィザードは,自動的にこれらのファイルを修正します。
しかしながら,新しいメソッドの骨格は,「Source Files」フォルダの UIADD.f90 に加えられる必要があります。ウィザードは,「Source Files」フォルダのファイルとして同じ名前のファイルを決して作成しません。これは,そのファイルに対して行われた修正が失われることを防ぐためです。その代わり,ウィザードは名前の最後にプラス記号 (+) をつけたファイルを生成します。たとえば,UIADD+.f90 です。ファイル UIADD+.f90 は,新しいメソッド IAdd_SetValue の骨格を含んでいます。この場合,以下のメッセージが TODO.TXT に追加され,TODO.TXT が Developer Studio のテキスト・エディタに開かれます。
The file UIAdd+.f90 has been generated with the following changes. You must merge these changes with the existing file UIAdd.f90. The method IAdd_SetValue has been added.
テキスト・エディタを使って UIADD+.f90 から新しいメソッドの骨格をコピーし,UIADD.f90 に貼り付けなければなりません。
変更がサーバー定義に行われると,必ず,「Source Files」フォルダにファイルに "+" の付いたバージョンが作成されます。TODO.TXT がプログラマの取るべき動作の情報を伝える場合を除いて,これらのファイルを無視することができます。
ソース・ファイルに変更を手動でマージする必要のある他の修正には,以下のものが含まれます。
新しいプロパティの追加
既存のメソッドの引数の変更
クラス,インタフェース,またはメソッドの名前の変更
クラス,インタフェース,またはメソッドの削除