OpenVMS Alpha
オペレーティング・システム
コネクティビティ開発者ガイド


前へ 次へ 目次 索引



第 6 章
COM for OpenVMS アプリケーションの開発

この章では,OpenVMS 用の COM アプリケーションの開発方法について説明します。

注意

この章で使用するサンプルの COM アプリケーションは, COM for OpenVMS キットの次のディレクトリにあります。


DCOM$EXAMPLES:[SAMPLE1] 
DCOM$EXAMPLES:[SIMPLE] 
DCOM$EXAMPLES:[DISPATCH_SAMPLE1] 

SAMPLE1DISPATCH_SAMPLE1は, Microsoft Press から出版されている Dale Rogerson 著『Inside COM』という書籍からの抜粋です。この書籍は COM アプリケーションを開発する際に非常に役立つ参考文献です。

ここでは, COM for OpenVMS アプリケーションの作成方法について説明します。

注意

COM for OpenVMS アプリケーションを開発する場合,プロセスの仮想メモリが必要です。 COM for OpenVMS アプリケーションを作成する前に,少なくとも 100,000 ページレットのページ・ファイル・クォータがあることを確認してください。これは DEC C++ コンパイラの要件です。

6.1 ステップ 1: 一意識別子を生成する

16 バイトのグローバル一意識別子 (GUID) を生成するには,DCOM$GUIDGENユーティリティを使用します。このユーティリティは OpenVMS スタイルと UNIX スタイルの両方をサポートします。次の例を参照してください。

次の表は GUID 形式オプションを示しています。

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 コンパイラは次のイメージで構成されています。

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ユーティリティを使用します。次の操作を行います。

  1. DCL コマンドDCOM$RUNSHRLIBを定義します。

    DCOM$RUNSHRLIB.EXEを使用しなければならないプロセスは,最初に OpenVMS DCL Command Definition ユーティリティを使用して,DCL コマンドDCOM$RUNSHRLIBを定義する必要があります。次の例を参照してください。


      $ SET COMMAND DCOM$LIBRARY:DCOM$RUNSHRLIB.CLD 
    


    DCOM$LIBRARY:DCOM$RUNSHRLIB.CLDDCOM$RUNSHRLIBDCL コマンドを定義します。次の表はコマンドのパラメータを示しています。

    引数 必須/省略可能
    P1 共用可能イメージ・ライブラリの名前。論理名,

    SYS$SHARE:内のイメージの名前,完全なファイル指定のいずれかを指定できます。

    必須
    P2 argc/argv ベクタで C または C++ main() ルーチンとして呼び出されるルーチンの名前。 必須
    P3 引用符で囲んだ修飾子の一覧。 省略可能

  2. DCOM$RUNSHRLIB.EXEを使用してコマンド・ラインを解析し,DCOM$MIDL_SHR共用可能イメージ・ライブラリ内のDCOM$MIDL_MAIN関数を呼び出すために, DCL シンボルmidlを定義します。次の例を参照してください。


      $ 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" 
    

6.2.3 必須 MIDL スイッチ

OpenVMS で MIDL を実行する場合,-OicfMIDL コマンド・ラインスイッチを指定しなければなりません。

6.2.4 必須インクルード・ディレクトリ

MIDL コンポーネントは通常,UNKNWN.IDLをインポートします。これにはIUnknownIClassFactoryのコンポーネント定義が含まれています。UNKNWN.IDLと他の COM 関連の IDL およびヘッダ・ファイルは,DCOM$LIBRARYにあります。コンポーネントの IDL ファイルを作成するには,次のスイッチを使用します。


-IDCOM$LIBRARY: 

6.2.5 必須ヘッダ・ファイル

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 項 を参照してください。

6.3.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++ 修飾子を指定しなければなりません。

6.3.5 必要な C 修飾子

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]

オプション・ファイルは次の方法でもインクルードできます。


前へ 次へ 目次 索引