前へ | 次へ | 目次 | 索引 |
この章では,OpenVMS 用の COM アプリケーションの開発方法について説明します。
ここでは, COM for OpenVMS アプリケーションの作成方法について説明します。
COM for OpenVMS アプリケーションを開発する場合,プロセスの仮想メモリが必要です。 COM for OpenVMS アプリケーションを作成する前に,少なくとも 100,000 ページレットのページ・ファイル・クォータがあることを確認してください。これは DEC C++ コンパイラの要件です。 |
16 バイトのグローバル一意識別子 (GUID) を生成するには,DCOM$GUIDGENユーティリティを使用します。このユーティリティは OpenVMS スタイルと UNIX スタイルの両方をサポートします。次の例を参照してください。
$ SET COMMAND DCOM$LIBRARY:DCOM$GUIDGEN.CLD $ DCOM$GUIDGEN [/FORMAT=value] [/COUNT=value] [/OUTPUT=value] |
$ mcr dcom$guidgen [-cdghirs?] [-on] |
OpenVMS 修飾子 (value) | UNIX スイッチ | 使い方 |
---|---|---|
IDL | -i | GUID を IDL インタフェース・テンプレートに出力する。 |
STRUCT | -s | GUID を初期化された C 構造体として出力する。 |
IMPLEMENT_OLECREATE | -c | GUID を IMPLEMENT_OLECREATE(...) 形式で出力する。 |
DEFINE_GUID | -d | GUID を DEFINE_GUID(...) 形式で出力する。 |
GUID_STRUCT | -g | GUID を初期化された静的 const GUID 構造体として出力する。 |
REGISTRY_GUID | -r | GUID をレジストリ形式で出力する。 |
この表の最後の 4 つのオプションは,Windows NT の Guidgenユーティリティの 4 つのオプションと同じです。 |
次の表は,DCOM$GUIDGENユーティリティでサポートされる追加オプションを示しています。
OpenVMS 修飾子 | UNIX スイッチ | 使い方 |
---|---|---|
/OUTPUT=filename | -ofilename | 出力を指定のファイルにリダイレクトする。 |
/COUNT=number | -nnumber | 生成する GUID の数を指定する。 |
not available | -h,-? | コマンド・オプションの要約を表示する。 |
同じ GUID に対して複数の形式を指定できます。
6.2 ステップ 2: MIDL コンパイラを使用してアプリケーションを構築する
この後の節では,MIDL コンパイラを使用してアプリケーションを構築する方法について説明します。
6.2.1 MIDL コンパイラの実行
MIDL コンパイラは次のイメージで構成されています。
DCL コマンド・ラインに指定された引数 (パラメータ) を取り出す実行可能イメージ。
DCOM$MIDL.EXEの実際の作業を行う共用可能イメージ・ライブラリ。
MIDL を実行するには,最初に DCL シンボルを定義しなければなりません。次の例を参照してください。
$ midl :== $dcom$midl $ midl -? $ midl -Oicf -idcom$library: example.idl |
midl -?コマンドは,有効なコマンド・ライン引数の一覧を表示します。これらの引数の一覧については, 付録 A を参照してください。
6.2.2 DCOM$RUNSHRLIB による MIDL コンパイラの実行
DCOM$MIDL.EXEユーティリティは, DCL フォーリン・コマンド・ライン・バッファから引数を取得します。 DCL フォーリン・コマンドでは最大 255 文字を使用できます。
DCOM$MIDL.EXEが受け付けることができる引数の数によっては,複雑な MIDL コマンド (たとえば引用符が必要な大文字と小文字が混在した引数を含むコマンドなど) を指定する場合は,この最大文字数を超えることがあります。
この問題を回避するには,SYS$SYSTEM:DCOM$RUNSHRLIB.EXEユーティリティを使用します。次の操作を行います。
DCOM$RUNSHRLIB.EXEを使用しなければならないプロセスは,最初に OpenVMS DCL Command Definition ユーティリティを使用して,DCL コマンドDCOM$RUNSHRLIBを定義する必要があります。次の例を参照してください。
$ SET COMMAND DCOM$LIBRARY:DCOM$RUNSHRLIB.CLD |
DCOM$LIBRARY:DCOM$RUNSHRLIB.CLDはDCOM$RUNSHRLIBDCL コマンドを定義します。次の表はコマンドのパラメータを示しています。
引数 | 値 | 必須/省略可能 |
---|---|---|
P1 | 共用可能イメージ・ライブラリの名前。論理名, SYS$SHARE:内のイメージの名前,完全なファイル指定のいずれかを指定できます。 |
必須 |
P2 | argc/argv ベクタで C または C++ main() ルーチンとして呼び出されるルーチンの名前。 | 必須 |
P3 | 引用符で囲んだ修飾子の一覧。 | 省略可能 |
$ midl :== DCOM$RUNSHRLIB DCOM$MIDL_SHR DCOM$MIDL_MAIN |
新しい DCL コマンド MIDL は,1 つの引用符で囲まれた文字列内の複数のコマンド・ライン引数を受け付けます。コマンドが長すぎる場合は,引用符で囲んだ複数の文字列を指定し,カンマで各文字列を区切ります。
たとえば,次の複雑な MIDL コマンドは,そのままでは使用できません。
$ midl :== $dcom$midl $ midl -Zp8 -Oicf -Os -oldnames -char unsigned - -error allocation -error bounds_check -error stub_data - -ms_ext -c_ext -out [.OBJ] - -I[INC] -I[PROJECT_WIDE_INC] -I[COMMON_INC] -IDCOM$LIBRARY: - -DRMS_DB "-DOpenVMS_Definitions" "-DPermanentProcess" - -header [.obj]example.h -client none -server none example.idl %DCL-W-TKNOVF, command element is too long - shorten |
次のように,
DCOM$RUNSHRLIBを使用すると,このコマンドを正しく指定できます。
$ set command dcom$library:dcom$runshrlib.cld $ midl :== DCOM$RUNSHRLIB DCOM$MIDL_SHR DCOM$MIDL_MAIN $ midl "-Zp8 -Oicf -Os -oldnames -char unsigned",- "-error allocation -error bounds_check -error stub_data",- "-ms_ext -c_ext -out [.OBJ]",- "-I[INC] -I[PROJECT_WIDE_INC] -I[COMMON_INC] -IDCOM$LIBRARY:",- "-DRMS_DB -DOpenVMS_Definitions -DPermanentProcess",- "-header [.obj]example.h -client none -server none example.idl" |
OpenVMS で MIDL を実行する場合,-OicfMIDL コマンド・ラインスイッチを指定しなければなりません。
6.2.4 必須インクルード・ディレクトリ
MIDL コンポーネントは通常,UNKNWN.IDLをインポートします。これにはIUnknownとIClassFactoryのコンポーネント定義が含まれています。UNKNWN.IDLと他の COM 関連の IDL およびヘッダ・ファイルは,DCOM$LIBRARYにあります。コンポーネントの IDL ファイルを作成するには,次のスイッチを使用します。
-IDCOM$LIBRARY: |
VMS_DCOM.Hヘッダ・ファイルには, Bristol の Wind/U® Win32 環境で COM for OpenVMS アプリケーションを正しくコンパイルするためのマクロ定義が含まれています。このヘッダ・ファイルは,自分で作成するファイルのうち,COM API や Win32 API に依存するすべてのソース・ファイルとヘッダ・ファイルに含まなければなりません。 MIDL で作成されるファイルは Win32 環境に依存するので,Compaq はすべての出力ファイルにVMS_DCOM.Hをインクルードするように,OpenVMS 用の MIDL コンパイラを変更しました。
6.3 ステップ 3: COM アプリケーションをコンパイルする
ここでは, COM for OpenVMS アプリケーションのコンパイルの方法について説明します。
OpenVMS Registry に対する Read アクセス権を必要とする COM アプリケーションを開発する場合は, REG$LOOKUP識別子があることを確認しなければなりません。コンパイル時または実行時に OpenVMS Registry に対して Read アクセス権と Write アクセス権を必要とするアプリケーションの場合, REG$UPDATE識別子または SYSPRV 特権が必要です。 OpenVMS Registry に関連する特権の詳細については, 第 7.5.1 項 を参照してください。 |
VMS_DCOM.Hファイルでは,Wind/U Win32 環境で使用される複数のマクロを定義しています。このヘッダ・ファイルを指定する include 文は,作成するすべてのソース・ファイル (コードまたはヘッダ・ファイル) のコメント以外の最初の行として指定しなければなりません。しかし,MIDL で生成されるファイルの場合,この規則が必ずしも保証されません。したがって,すべての C コマンドと CXX コマンドに次の /DEFINE 修飾子を必ず指定してください。
/DEFINE=(UNICODE=1,_WINDU_SOURCE=0X041000,_WIN32_DCOM) |
UNICODEマクロは,コードをコンパイルするときに, Win32 API とデータ構造のワイド文字バージョンが有効に設定されているかどうか確認します (このマクロはVMS_DCOM.Hにも定義されています)。このマクロを省略すると,Wind/U Win32 環境でコンパイル・エラーが発生することがあります。
他の 2 つのマクロ定義は Wind/U ヘッダ・ファイルで認識され,構造と COM API の正しい定義を行うのに必要です。
6.3.2 必要なインクルード・ディレクトリ
COM for OpenVMS アプリケーションでは通常,DCOM$LIBRARYに格納されているヘッダ・ファイルが必要です。
次の修飾子を C および CXX コマンド・ラインに指定してください。
/INCLUDE=DCOM$LIBRARY |
/INCLUDE修飾子がコマンド・ラインにすでに指定されている場合は,DCOM$LIBRARYをインクルードするようにコマンドを変更してください。
6.3.3 必要なヘッダ・ファイル: VMS_DCOM.H
VMS_DCOM.Hヘッダ・ファイルでは, Wind/U ヘッダ・ファイルで使用される複数のマクロが定義されています。
このヘッダ・ファイルは,ソース・ファイル (ヘッダ・ファイルとインプリメンテーション・ファイルの両方) にコメント以外の最初の行として指定しなければなりません。
6.3.4 必要な C++ 修飾子
COM for OpenVMS アプリケーションを作成する場合は,次の C++ 修飾子を指定しなければなりません。
C++ 例外を有効にするために,C++ コマンドに/EXCEPTIONS=CLEANUP修飾子を指定します。
C++ コンパイラでは多くのコンパイル標準規格がサポートされます。可能な限り/STANDARD=CFRONTを使用してください。
/STANDARD=CFRONTは, AT&T® cfront 実装に定義されている言語表記規則に従うように,コンパイラに要求します。Wind/U ヘッダ・ファイルは OpenVMS プラットフォームの他に,複数の UNIX プラットフォームでも使用されるため,これらのヘッダ・ファイルに対してこのスイッチを使用すると便利です。
COM for OpenVMS アプリケーションを開発するときに指定しなければならない DEC C 固有の修飾子はありません。
6.4 ステップ 4: COM アプリケーションをリンクする
COM for OpenVMS アプリケーションを作成するには,クライアント・イメージとコンポーネント・イメージの両方を作成しなければなりません。コンポーネントは,プロセス内コンポーネントまたはプロセス外コンポーネントとして実装できるため,共用可能イメージと実行可能イメージのどちらか一方,または両方を作成する必要があります。新しいインタフェースを作成する場合は,プロキシ/スタブ共用可能イメージも作成しなければなりません。プロキシ/スタブ共用可能イメージは,リモート・メソッド呼び出しの準備として,そのインタフェースのパラメータをパッケージするインタフェース固有のオブジェクトを提供します。プロキシは送信側のアドレス空間で動作し,受信側のアドレス空間の対応するスタブと通信します。
ここでは,クライアント,コンポーネント,プロキシ/スタブ・イメージをリンクするときに必要な手順について説明します。
6.4.1 クライアントとプロセス外コンポーネントのリンク
クライアント・イメージやコンポーネント実行可能イメージをリンクするために,修飾子を指定する必要はありませんが,次のように 2 つのイメージをリンクしなければなりません。
リンク時に発生する依存関係は次のとおりです。
1 つ以上の C++ モジュールがある場合は,標準の OpenVMS リンカの代わりに C++ リンカ (CXXLINK) を使用して,C++ リポジトリの場所を指定できるようにします (/CXX_REPOSITORY 修飾子)。次の例を参照してください。
$ CXXLINK/your-specific-linker-qualifiers list-of-object-modules, - _$ DCOM$WIN32:WINDU.OPT/OPTIONS, DCOM$LIBRARY:DCOM.OPT/OPTIONS - _$ application.OPT/OPTIONS /REPOSITORY=[.CXX_REPOSITORY] |
オプション・ファイルは次の方法でもインクルードできます。
前へ | 次へ | 目次 | 索引 |