COBOL2002 ユーザーズガイド

[目次][用語][索引][前へ][次へ]

26.3.2 COBOL2002でのOLE2サーバの作成

COBOL2002でOLE2サーバを作成する方法について説明します。

COBOL2002ではクラスを一つだけ持つOLE2サーバを作成できます。クラス名は,次のようになります。

COBOL2002で作成したOLE2サーバのクラス名
サーバ名. COBOLProgramClass
サーバ名
OLE2サーバとして作成されたCOBOL2002プログラムの実行可能ファイル名(ただし拡張子は除く)
<この項の構成>
(1) インプロセスサーバの作成
(2) アウトオブプロセスサーバの作成
(3) 一般規則
(4) プログラム作成時の注意事項
(5) 実行時の注意事項

(1) インプロセスサーバの作成

インプロセスサーバを作成するときは,コンパイル時に-OleServer,Dllオプションを指定します。

形式
ccbl2002 -OleServer,Dll〔,RegSet〕
         〔コンパイラオプション〕 ファイル名 …
         〔-OutputFile OLE2サーバ名.dll〕

規則
  • -OleServer,DllオプションにRegSetサブオプションを指定すると,インプロセスサーバとしてコンパイルされたあと,自動的にレジストリへ登録されます。
  • -OleServer,Dllオプションと-OleServer,Exeオプションを同時に指定することはできません。
  • 形式中のコンパイラオプションに,次のオプションを指定しても無効になります。
    -Lib,CUI -SimMain -BigEndian,Bin -BigEndian,Float -Bin1Byte
    -EquivRule,NotAny -EquivRule,NotExtend -EquivRule,StdCode
    -V3Rec,Fixed -V3Rec,Variable -MultiThread
  • 形式中のコンパイラオプションに-CompatiV3オプションを指定した場合,同時に-V3Rec,Variableオプションは仮定されません。
  • -OleServer,Dllオプションを指定すると,-Dll,Stdcallオプションが仮定されます。
  • cdecl属性のインプロセスサーバを作成することはできません。-Dll,Stdcallオプションと同時に-Dll,Cdeclオプションを指定した場合,-Dll,Cdeclオプションは無効になります。
  • OLE2サーバ名には,作成するOLE2サーバ名を一つだけ指定します。サーバ名には,必ず拡張子(.dll)を付けます。

注意事項
  • 環境変数CBLCOPT2002に-OleServer,Exe,-OleServer,Dll,-OleServer,Exe,RegSet,および-OleServer,Dll,RegSetオプションを指定しないでください。
  • ccbl2002コマンドを起動するときのカレントフォルダは,ドライブ名を含めた絶対パスの長さが,100バイト以内でなければなりません。
  • OLE2サーバ名の長さは,40文字以内でなければなりません。
  • OLE2サーバが作成されるフォルダのドライブ名を含めた絶対パスの長さと,ファイル名の長さの合計は,122バイト以内でなければなりません。
  • -OutputFileオプションを指定しない場合,OLE2サーバ名にはコマンド列の先頭にあるCOBOLソースファイル名が仮定されます。
  • すでにCOBOL OLE2サーバがレジストリに登録されている状態で,COBOL OLE2サーバプログラムを新たにコンパイルしないでください。この場合,一度レジストリからCOBOL OLE2サーバを削除したあと,コンパイルしてください。レジストリの削除については,「26.3.4 レジストリへの登録と削除」を参照してください。

(2) アウトオブプロセスサーバの作成

アウトオブプロセスサーバを作成するときは,コンパイル時に-OleServer,Exeオプションを指定します。

形式
ccbl2002 -OleServer,Exe〔,RegSet〕
         〔コンパイラオプション〕 ファイル名 …
         〔-OutputFile OLE2サーバ名.exe〕

規則
  • -OleServer,ExeオプションにRegSetサブオプションを指定すると,アウトオブプロセスサーバとしてコンパイルされたあと,自動的にレジストリへ登録されます。
  • -OleServer,Exeオプションと-OleServer,Dllオプションを同時に指定することはできません。
  • -OleServer,Exeオプションと-Dll,Stdcallオプションを同時に指定することはできません。
  • 形式中のコンパイラオプションに次のオプションを指定しても無効になります。
    -Lib,CUI -SimMain -BigEndian,Bin -BigEndian,Float -Bin1Byte
    -EquivRule,NotAny -EquivRule,NotExtend -EquivRule,StdCode
    -V3Rec,Fixed -V3Rec,Variable -MultiThread
  • 形式中のコンパイラオプションに-CompatiV3オプションを指定した場合,同時に-V3Rec,Variableオプションは仮定されません。
  • -OleServer,Exeオプションを指定すると,-MainNotCBLオプションが仮定されます。
  • OLE2サーバ名には,作成するOLE2サーバ名を一つだけ指定します。サーバ名には,必ず拡張子(.exe)を付けます。

注意事項
  • 環境変数CBLCOPT2002に-OleServer,Exe,-OleServer,Dll,-OleServer,Exe,RegSet,および-OleServer,Dll,RegSetオプションを指定しないでください。
  • ccbl2002コマンドを起動するときのカレントフォルダは,ドライブ名を含めた絶対パスの長さが,100バイト以内でなければなりません。
  • OLE2サーバ名の長さは,40文字以内でなければなりません。
  • OLE2サーバが作成されるフォルダのドライブ名を含めた絶対パスの長さと,ファイル名の長さの合計は,122バイト以内でなければなりません。
  • -OutputFileオプションを指定しない場合,OLE2サーバ名にはコマンド列の先頭にあるCOBOLソースファイル名が仮定されます。ただし,オブジェクトファイル(.obj)またはライブラリファイル(.lib)を同時に指定したときは,サーバ名にはNONAME1.exeが仮定されます。
  • すでにCOBOL OLE2サーバがレジストリに登録されている状態で,COBOL OLE2サーバプログラムを新たにコンパイルしないでください。この場合,一度レジストリからCOBOL OLE2サーバを削除したあと,コンパイルしてください。レジストリの削除については,「26.3.4 レジストリへの登録と削除」を参照してください。

(3) 一般規則

(a)
COBOL OLE2サーバでは,COBOLの副プログラムがOLEメソッドに相当します。

(b)
OLEプロパティは,外部属性を持つデータ項目(EXTERNAL句指定)で公開できます。また,OLEメソッドは,PROGRAM-IDで示したプログラム名で公開できます。

(c)
OLEメソッドの引数や戻り値が基本項目のとき,次のデータ項目は指定できません。
  • アドレスデータ項目
  • 指標データ項目
  • BY REFERENCE指定のバリアントデータ項目
  • 内部ブール項目,および外部ブール項目で,長さが2以上のもの
  • オブジェクト参照データ項目

(d)
OLEメソッドの引数や戻り値が集団項目のとき,従属項目には英字項目,英数字項目,または日本語項目を参照させるようにしてください。それ以外のデータ項目を参照させた場合,結果は保証しません。また,強く型付けされた集団項目を参照してはいけません。

(e)
OLEプロパティ(外部属性を持つデータ項目)が基本項目の場合,次のデータ項目は指定できません。
  • 外部浮動小数点数字項目
  • 編集項目
  • アドレスデータ項目
  • 指標データ項目
  • バリアントデータ項目
  • OLEオブジェクト参照データ項目
  • 内部ブール項目,および外部ブール項目で,長さが2以上のもの
  • オブジェクト参照データ項目

(f)
OLEプロパティ(外部属性を持つデータ項目)が集団項目のとき,従属項目には英字項目,英数字項目,または日本語項目を参照させるようにしてください。それ以外のデータ項目を参照させた場合,結果は保証しません。また,強く型付けされた集団項目を参照してはいけません。

(g)
次の文を使用した場合,動作は保証しません。
  • STOP文
  • ACCEPT文を使った入力処理
  • DISPLAY文
  • 画面節(WINDOW SECTION)による画面機能
  • 画面節(SCREEN SECTION)による画面機能
  • ウィンドウ表示するCOBOLサービスルーチン

(4) プログラム作成時の注意事項

(a)
OLE2サーバをインプロセスサーバとして作成した場合,次の点に注意してください。
  • COBOL OLE2クライアントから渡されたOLEオブジェクト参照データ項目に対して,COBOL OLE2サーバ側がNULLを指定してはいけません。

(b)
OLE2サーバ内のプログラムは,すべてOLEメソッドとして扱われます(内側のプログラムを除く)。OLEメソッドとして使わず,通常のCOBOL副プログラムとしてCALL文で呼び出して使うこともできますが,その場合次のデータ項目を受け渡しできません。
  • アドレスデータ項目
  • 指標データ項目
  • BY REFERENCE指定のバリアントデータ項目
  • 内部ブール項目,および外部ブール項目で,長さが2以上のもの
  • オブジェクト参照データ項目
これらのデータ項目を受け渡しするときは,OLE2サーバとして生成されていない副プログラムをCALL文で呼び出してください。

(c)
OLE2サーバをコンパイルする場合,同一フォルダで同時にccbl2002コマンドを実行しないでください。OLE2サーバが正しく生成されないことがあります。

(d)
CBLOLE2UNINITサービスルーチンを使って,OLE2サーバを終了しないでください。

(e)
OLEプロパティとして使用する外部属性を持つデータ項目(EXTERNAL句指定),およびOLEメソッドとして使用するプログラム名に含まれるハイフン(-)は,下線(_)に変換されます。SET文やINVOKE文でハイフンの含まれる名称を参照するときは,下線に置き換えなければなりません。同様に,次の文字列を扱うときも注意が必要です。
  • #,\,@
  • 英小文字
変換規則の詳細は,マニュアル「COBOL2002 言語 標準仕様編 7.8.2 構文規則」を参照してください。

(f)
OLE2サーバのプログラム名に次の日本語文字を含んではいけません。
日本語空白文字 + * / = \ ( ) < > &
,(コンマ) ;(セミコロン) :(コロン) .(ピリオド)
’(アポストロフィ) "(引用符)

(g)
次のデータ項目は,COBOLデータとVARIANT値の変換規則に従って,VARIANT値のVT_R8(5)に変換されます。このとき,中間値として倍精度内部浮動小数点の数字項目に変換されるため,結果に誤差が含まれるときがあります。
  • 外部浮動小数点数字項目
  • 2進項目,外部10進項目,および内部10進項目で,10けたを超えるもの
  • 2進項目,外部10進項目,および内部10進項目で,PICTURE文字「V」または「P」を含むもの

(h)
OLE2サーバのクラスに文字列を返すOLEメソッドを作成した場合,OLE2クライアントはその文字列を格納できるだけの領域を確保しなければなりません。

(i)
OLE2サーバプログラムで,OLEプロパティ,OLEメソッドの引数,およびOLEメソッドの戻り値となるデータ項目の長さは,1,073,741,807バイト以内でなければなりません。

(j)
上記(a)〜(i)の規則に反したプログラムをコンパイルした場合,またはプログラム名やデータ項目名に何らかの誤りがある場合,~Oleで始まるCOBOL原始プログラムでコンパイルエラーが発生することがあります。このような場合は,コンパイルの対象となった原始プログラムの方を見直して,エラーの要因を取り除いてください。

(l)
OleやCblで始まる名称を,ソースファイルやOLE2サーバファイルに付けないでください。これらの名称はコンパイラが使用します。

(m)
DYNAMIC指定のEXTERNAL句を指定した項目は,OLEプロパティとして公開されません。

(n)
次の言語仕様を使用したプログラムは,OLE2サーバとして作成できません。作成しようとした場合,コンパイルエラーとなります。
  • 見出し部
    関数名段落(FUNCTION-ID),クラス名段落(CLASS-ID),インタフェース名段落(INTERFACE-ID)
  • リポジトリ段落
    クラス指定子,インタフェース指定子,関数指定子

(5) 実行時の注意事項

(a)
COBOL OLE2サーバが返すOLEメソッドの戻り値やOLEプロパティ値では,データ項目の末尾にある空白列は切り捨てられます。

(b)
COBOL以外の言語を使い,COBOL OLE2サーバ中の数字編集項目,英数字編集項目,日本語編集項目でOLEメソッドの引数や戻り値を受け渡すとき,COBOL OLE2サーバでは英数字項目として扱われます。

(c)
COBOL OLE2サーバでエラーが発生した場合,実行時のエラーメッセージや異常終了時要約リストに,COBOLシステムが作成したプログラム名やデータ項目名(OLEプロパティ名)が出力されることがあります。このようなファイル名やOLEプロパティ名が出力されたときは,対応するサーバプログラムのソースファイルを見直してください。
出力されるプログラム名の形式
CBL COBOLシステムが作成したプログラムの名称 9けたの数字
出力されるプロパティ名の形式
[図データ]
問題のあるプログラム,またはプロパティの名称は,OLE2サーバプログラム中で宣言した名称そのものか,先頭からの部分名称です。

(d)
アウトオブプロセスサーバは,OLE2サーバクライアント側で設定されたCOBOLの環境変数を参照できません。物理ファイルの割り当てや実行環境のパラメタの設定で環境変数を使う場合は,実行支援を使って,実行環境ファイル(.cbr)を作成してください。実行環境ファイルがないと環境変数が定義されず,実行時エラーとなります。

(e)
アウトオブプロセスサーバで環境変数にファイル名を指定するときは,ドライブ名,およびフォルダ名を付けた絶対パス名で指定してください。

(f)
次の条件をすべて満たしている場合,COBOL OLE2サーバで実行時エラーが発生している可能性があります。環境変数CBLSRVERRで設定したメッセージ出力ファイルの内容を確認してください。環境変数CBLSRVERRについては,「26.3.6 実行時エラーメッセージの取得方法」を参照してください。
  • アウトオブプロセスサーバが異常終了した
  • COBOL OLE2クライアントのINVOKE文で実行時エラーが発生した
  • OLEサーバ側で実行時エラーが発生した
    このとき出力されるエラーメッセージはKCCC8501R-Sで,詳細情報「SYSTEM OTHER ERROR(0x800706be)」である

(g)
インプロセスサーバに対して,一つのクライアントから同じオブジェクトを複数生成しても,オブジェクトハンドラはすべて同一のオブジェクトを指します。したがって,一つのオブジェクトを操作してサーバ内の変数を更新すると,ほかのオブジェクトも影響を受けます。

(h)
インプロセスサーバに初期化属性を持たせるためには,-OleServer,Dllオプションと同時に-DllInitオプションを指定してコンパイルしてください。

(i)
インプロセスサーバで,日本語データ名,または指標付きデータ名をOLEプロパティに指定すると,データ項目はOLE2クライアント,および複数の異なるOLE2サーバ間で共用されます。これらの項目は,実行時にOLE2クライアントや複数のOLE2サーバの間で,EXTERNAL句としての属性チェックがされます。
日本語データ名,指標付きデータ名のどちらでもないデータ項目をプロパティに指定した場合,データ項目は共用されません。