COBOL2002 ユーザーズガイド


付録D.2 サービスルーチンを使ったOLE2オートメーションクライアント機能

ここでは,サービスルーチンを使ってOLE2オートメーションクライアント機能を使用する方法について説明します。

なお,通常OLE2オートメーションクライアント機能を使用する場合は,「25.2 OLE2オートメーションクライアント機能」に示す方法を使用してください。

〈この項の構成〉

(1) サービスルーチンの一覧

OLE2オートメーションクライアント機能を使用するためにCOBOL2002が用意しているサービスルーチンの種類を次に示します。なお,サービスルーチンは,表中の呼び出し順序に従って呼び出す必要があります。

表D‒1 サービスルーチンの種類

呼び出し順序

サービスルーチン

機能

1

CBLOLE2INIT

OLE2を初期設定する。

2

CBLCREATEOBJ

操作したいOLE2サーバのOLEオブジェクトを生成する。

CBLGETOBJ

操作したいOLE2サーバのOLEオブジェクトを取得する。

3

CBLGETPROPERTY

OLE2サーバのOLEプロパティの値を取得する。

CBLPUTPROPERTY

OLE2サーバのOLEプロパティに値を設定する。

CBLMETHODCALL

OLE2サーバのOLEメソッドを操作する。

CBLVARIANTINF

VARIANT値の属性を調べる。

CBLSETCBLITEM

VARIANT値からCOBOLデータ項目に変換する。

CBLSETVARIANT

COBOLデータ項目からVARIANT値に変換する。

4

CBLOLE2UNINIT

OLE2を終了させる。

なお,各サービスルーチンの「戻り値」に記されているエラーコード値の内容については,「(3) エラーコード値」を参照してください。

(2) サービスルーチンの詳細

サービスルーチンの詳細を以下に示します。

なお,使用例のプログラムをWindows(x64) COBOL2002で使用する場合は,読み替えが必要です。

使用例の記述(Windows(x86) COBOL2002で使用)
01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
読み替えの記述(Windows(x64) COBOL2002で使用)
01 ARG1 PIC 9(18) USAGE COMP VALUE ZERO.

(a) CBLOLE2INIT

OLE2の初期値を設定するサービスルーチンです。

形式
CALL 'CBLOLE2INIT' USING BY VALUE 引数1
                   BY REFERENCE 引数2.
引数
  • 引数1には,4バイトの2進項目で0を設定します。このサービスルーチンを呼び出したあとに,引数1の値を書き換えないでください。

  • 引数2は,次の集団項目を要求します。

           01 引数2.
            02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.

    4バイトの2進項目で0を設定します。

注※

Windows(x64) COBOL2002の場合は8バイトに読み替えてください。

戻り値

正常:0

上記以外:エラーコード値

注意事項

CBLOLE2INITサービスルーチンは,次のサービスルーチンより先に呼び出されている必要があります。

  • CBLCREATEOBJ

  • CBLVARIANTINF

  • CBLGETOBJ

  • CBLSETCBLITEM

  • CBLGETPROPERTY

  • CBLSETVARIANT

  • CBLPUTPROPERTY

  • CBLOLE2UNINIT

  • CBLMETHODCALL

使用例
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMINIT.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
           :
       PROCEDURE DIVISION.
           :
           CALL 'CBLOLE2INIT' USING BY VALUE ARG1
                              BY REFERENCE PRMINIT.

(b) CBLCREATEOBJ

OLE2サーバのOLEオブジェクトを生成します。

形式
CALL 'CBLCREATEOBJ' USING BY VALUE 引数1
                          BY REFERENCE 引数2 引数3.
引数
  • 引数1には,CBLOLE2INITで設定した引数1を指定します。

  • 引数2は,このサービスルーチンが生成したOLE2サーバのOLEオブジェクトを格納する領域です。この領域はアドレスデータ項目で設定します。サービスルーチンの発行時は0を設定します。

           01 引数2 USAGE ADDRESS.

    次のサービスルーチンを呼び出す場合,この領域と同じ領域を先に設定しておく必要があります。

    ・CBLGETPROPERTY

    ・CBLPUTPROPERTY

    ・CBLMETHODCALL

    設定しないでこれらのサービスルーチンを呼び出した場合の結果は保証しません。

  • 引数3は,次の集団項目を要求します。

           01 引数3.
            02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
            02 データ名1 PIC 9(9) USAGE COMP.        … 2.
            02 データ名2 USAGE ADDRESS.              … 3.
項目の説明
  1. 4バイトの2進項目で0を設定します。

  2. 3.で指定する領域がポイントする領域の長さを,4バイトの2進項目で設定します。

  3. OLE2サーバのクラス名を指定します。この領域は,アドレスデータ項目で定義します。この領域がポイントする領域は,次のような基本項目です(xx:クラス名を格納するのに必要なバイト数)。

        01 データ名 PIC X(xx).
戻り値

正常:0

上記以外:エラーコード値

使用例
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMOBJ USAGE ADDRESS.
       01 PRMCREATEOBJ.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 CLSLENG PIC 9(9) COMP VALUE 17.
        02 CLSNAMEPTR USAGE ADDRESS.
       01 CLASSNAME PIC X(17) VALUE 'Excel.Application'.
           :
       PROCEDURE DIVISION.
           COMPUTE PRMOBJ = ZERO.
           COMPUTE CLSNAMEPTR = FUNCTION ADDR(CLASSNAME).
           CALL 'CBLCREATEOBJ'
                USING BY VALUE ARG1
                      BY REFERENCE PRMOBJ PRMCREATEOBJ.

(c) CBLGETOBJ

OLE2サーバのOLEオブジェクトをファイルから取得する場合,またはすでにOLE2サーバが起動している場合に,そのOLE2サーバのOLEオブジェクトを取得するサービスルーチンです。

形式
CALL 'CBLGETOBJ' USING BY VALUE 引数1
                 BY REFERENCE 引数2 引数3.
引数
  • 引数1には,CBLOLE2INITで設定した引数1を指定します。

  • 引数2は,このサービスルーチンが取得したOLE2サーバのOLEオブジェクトを格納する領域です。この領域はアドレスデータ項目で設定します。サービスルーチンの発行時は0を設定します。

           01 引数2 USAGE ADDRESS.

    次のサービスルーチンを呼び出す場合,この領域と同じ領域を設定して呼び出す必要があります。設定しないで呼び出した場合の結果は保証しません。

    ・CBLGETPROPERTY

    ・CBLPUTPROPERTY

    ・CBLMETHODCALL

  • 引数3は,次の集団項目を要求します。

Windows(x86) COBOL2002の場合
       01 引数3.
         02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
         02 データ名1 PIC 9(9) USAGE COMP.        … 2.
         02 データ名2 USAGE ADDRESS.              … 3.
         02 データ名3 PIC 9(9) USAGE COMP.        … 4.
         02 データ名4 USAGE ADDRESS.              … 5.
Windows(x64) COBOL2002の場合
       01 引数3.
         02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
         02 データ名1 PIC 9(9) USAGE COMP.        … 2.
         02 データ名2 USAGE ADDRESS.              … 3.
         02 データ名3 PIC 9(9) USAGE COMP.        … 4.
         02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
         02 データ名4 USAGE ADDRESS.              … 5.
項目の説明
  1. 4バイトの2進項目で0を設定します。

  2. 3.で指定する領域がポイントする領域の長さを4バイトの2進項目で設定します。

  3. 取得したいOLEオブジェクトが含まれているファイルの絶対パス名,およびファイル名を格納した領域のポインタを指定します。この領域は,アドレスデータ項目で定義します。この領域がポイントする領域は次のような基本項目です(xx:ファイル名を格納するのに必要なバイト数)。

    01 データ名 PIC X(xx).
  4. 5.で指定する領域がポイントする領域の長さを4バイトの2進項目で設定します。

  5. OLE2サーバのクラス名を格納した領域のポインタを指定します。この領域はアドレスデータ項目で定義します。この領域がポイントする領域は,次のような基本項目です(xx:クラス名を格納するのに必要なバイト数)。

        01 データ名 PIC X(xx).
戻り値

正常:0

上記以外:エラーコード値

使用例
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMOBJ USAGE ADDRESS.
       01 PRMGETOBJ.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 FILELENG PIC 9(9) USAGE COMP VALUE 16.
        02 FILENAMEPTR USAGE ADDRESS.
        02 CLSLENG PIC 9(9) USAGE COMP VALUE 11.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 CLSNAMEPTR USAGE ADDRESS.
       01 FILENAME PIC X(16) VALUE 'c:\temp\data.xls'.
       01 CLASSNAME PIC X(11) VALUE 'Excel.Sheet'.
           :
       PROCEDURE DIVISION.
           COMPUTE PRMOBJ = ZERO.
           COMPUTE FILENAMEPTR = FUNCTION ADDR(FILENAME).
           COMPUTE CLSNAMEPTR = FUNCTION ADDR(CLASSNAME).
           CALL 'CBLGETOBJ'
                USING BY VALUE ARG1
                      BY REFERENCE PRMOBJ PRMGETOBJ.
注※

Windows(x64) COBOL2002では追加してください。

(d) CBLGETPROPERTY

OLE2サーバのOLEオブジェクトのOLEプロパティの値を取得するサービスルーチンです。

形式
CALL 'CBLGETPROPERTY' USING BY VALUE 引数1
                      BY REFERENCE 引数2 引数3 引数4.
引数
  • 引数1には,CBLOLE2INITで設定した引数1を指定します。

  • 引数2には,CBLCREATEOBJおよびCBLGETOBJサービスルーチンが生成・取得したOLE2サーバのOLEオブジェクトを格納している領域を指定します。

           01 引数2 USAGE ADDRESS.

    この領域は,アドレスデータ項目で必ず指定してください。

  • 引数3は,このサービスルーチンが,OLE2サーバのOLEプロパティから取得したVARIANT値のアドレスを設定します。初期値としては0を設定します。

           01 引数3 USAGE ADDRESS.

    この値は,CBLSETCBLITEMサービスルーチンでCOBOLのデータ項目に設定できます。

  • 引数4は,次の集団項目を要求します。

           01 引数4.
            02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
            02 データ名1 PIC 9(9) USAGE COMP.        … 2.
            02 データ名2 USAGE ADDRESS.              … 3.
項目の説明
  1. 4バイトの2進項目で0を設定します。

  2. 3.で指定する領域がポイントする領域の長さを4バイトの2進項目で設定します。

  3. OLE2サーバのOLEプロパティおよびそれまでのコンテナ,コレクションをピリオドで区切った文字列を格納した領域のポインタを指定します。また,この領域はアドレスデータ項目で定義します。この領域がポイントする領域は次のような基本項目です(xx:文字列を格納するのに必要なバイト数)。

        01 データ名 PIC X(xx).
戻り値

正常:0

上記以外:エラーコード値

注意事項

3.で指定した領域がポイントする文字列の中で,ピリオドで区切られているいちばん右側の文字列がOLEプロパティと判断されます。また,これ以外はすべてコレクションまたはコンテナと判断されます。

使用例
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMOBJ USAGE ADDRESS.
       01 PRMVARIANT USAGE ADDRESS.
       01 PRMGETPROPERTY.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 STRINGLENG PIC 9(9) USAGE COMP VALUE 43.
        02 STRINGNAMEPTR USAGE ADDRESS.
       01 STRINGNAME PIC X(43)VALUE
          'Workbooks(1).Worksheets(1).Cells(1,1). Value'.
           :
       PROCEDURE DIVISION.
           CALL 'CBLCREATEOBJ' USING …
           COMPUTE PRMVARIANT = ZERO.
           COMPUTE STRINGNAMEPTR
                   = FUNCTION ADDR(STRINGNAME).
           CALL 'CBLGETPROPERTY'
                USING BY VALUE ARG1
                      BY REFERENCE PRMOBJ
                                   PRMVARIANT
                                   PRMGETPROPERTY.

(e) CBLPUTPROPERTY

OLE2サーバのOLEオブジェクトのOLEプロパティに値を設定するサービスルーチンです。

形式
CALL 'CBLPUTPROPERTY' USING BY VALUE 引数1
                    BY REFERENCE 引数2 引数3 引数4.
引数
  • 引数1には,CBLOLE2INITで設定した引数1を指定します。

  • 引数2には,CBLCREATEOBJおよびCBLGETOBJサービスルーチンが生成,取得したOLE2サーバのOLEオブジェクトを格納した領域を指定します。

      01 引数2 USAGE ADDRESS.

    この領域は,アドレスデータ項目で必ず指定してください。

  • 引数3は,このサービスルーチンがOLE2サーバのOLEプロパティに設定するVARIANT値のアドレスを設定します。初期値としては0を設定します。

      01 引数3 USAGE ADDRESS.

    この領域は,アドレスデータ項目で定義します。

    この値は,設定するCOBOLのデータ項目をあらかじめCBLSETVARIANTサービスルーチンによってVARIANT値に変換しておきます。

  • 引数4は,次の集団項目を要求します。

           01 引数4.
            02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
            02 データ名1 PIC 9(9) USAGE COMP.        … 2.
            02 データ名2 USAGE ADDRESS.              … 3.
項目の説明
  1. 4バイトの2進項目で0を設定します。

  2. 3.で指定する領域がポイントする領域の長さを4バイトの2進項目で設定します。

  3. OLE2サーバのOLEプロパティおよびそれまでのコンテナ,コレクションをピリオドで区切った文字列を格納した領域のポインタを指定します。また,この領域はアドレスデータ項目で定義します。この領域がポイントする領域は次のような基本項目です(xx:文字列を格納するのに必要なバイト数)。

        01 データ名 PIC X(xx).
戻り値

正常:0

上記以外:エラーコード値

注意事項

3.で指定した領域がポイントする文字列の中で,ピリオドで区切られているいちばん右側の文字列がOLEプロパティと判断されます。また,これ以外はすべてコレクションまたはコンテナと判断されます。

使用例
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMOBJ USAGE ADDRESS.
       01 PRMVARIANT USAGE ADDRESS.
       01 PRMPUTPROPERTY.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 STRINGLENG PIC 9(9) USAGE COMP VALUE 43.
        02 STRINGNAMEPTR USAGE ADDRESS.
       01 STRINGNAME PIC X(43) VALUE
          'Workbooks(1).Worksheets(1).Cells(1,1).Value'.
           :
       PROCEDURE DIVISION.
           CALL 'CBLCREATEOBJ' USING …
           COMPUTE PRMVARIANT =
                 (CBLSETVARIANTサービスルーチンで
                  変換したVARIANT値).
           COMPUTE STRINGNAMEPTR
                   = FUNCTION ADDR(STRINGNAME).
           CALL 'CBLPUTPROPERTY' USING
                BY VALUE ARG1
                BY REFERENCE PRMOBJ
                             PRMVARIANT
                             PRMPUTPROPERTY.

(f) CBLMETHODCALL

OLE2サーバのOLEオブジェクトのOLEメソッドを操作するサービスルーチンです。

形式
CALL 'CBLMETHODCALL' USING BY VALUE 引数1
          BY REFERENCE 引数2 引数3 引数4.
引数
  • 引数1には,CBLOLE2INITで設定した引数1を指定します。

  • 引数2には,CBLCREATEOBJおよびCBLGETOBJサービスルーチンが生成,取得したOLE2サーバのOLEオブジェクトを格納した領域を指定します。

           01 引数2 USAGE ADDRESS.

    この領域は,アドレスデータ項目で必ず指定してください。

  • 引数3は,このサービスルーチンがOLE2サーバのOLEメソッドから返される値を設定するVARIANT値のアドレスを設定します。

           01 引数3 USAGE ADDRESS.

    この領域はアドレスデータ項目で定義します。OLEメソッドが値を返さない場合は0を設定します。

  • 引数4は,次の集団項目を要求します。

Windows(x86) COBOL2002の場合
       01 引数4.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
        02 データ名1 PIC 9(9) USAGE COMP.        … 2.
        02 データ名2 USAGE ADDRESS.              … 3.
        02 データ名3 PIC 9(9) USAGE COMP.        … 4.
        02 データ名4 USAGE ADDRESS.              … 5.
Windows(x64) COBOL2002の場合
       01 引数4.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
        02 データ名1 PIC 9(9) USAGE COMP.        … 2.
        02 データ名2 USAGE ADDRESS.              … 3.
        02 データ名3 PIC 9(9) USAGE COMP.        … 4.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
        02 データ名4 USAGE ADDRESS.              … 5.
項目の説明
  1. 4バイトの2進項目で0を設定します。

  2. 3.で指定する領域がポイントする領域の長さを4バイトの2進項目で設定します。

  3. パラメタを含む該当するメソッド,およびそれまでのコンテナ,コレクションをピリオドで区切った文字列を格納した領域のポインタを指定します。また,この領域はアドレスデータ項目で定義します。

    この領域がポイントする領域は次のような基本項目です(xx:文字列を格納するのに必要なバイト数)。

      01 データ名 PIC X(xx).
  4. この領域は,OLEメソッドに引数を指定する場合に,3.で指定した領域中のOLEメソッドの文字列にパラメタを含めて指定するのではなく,VARIANT値の配列として指定するとき,5.で指定する引数の配列テーブルのエントリ数を設定します。

    3.で指定する領域中のメソッドの文字列にパラメタを含める場合,またはOLEメソッドにパラメタがない場合は0を設定します。4バイトの2進項目で設定します。

  5. この領域は,OLEメソッドに引数を指定する場合に,3.で指定する領域中のOLEメソッドの文字列にパラメタを含めて指定するのではなく,VARIANT値の配列として指定するとき,引数の配列テーブルのアドレスを設定します。

    この領域がポイントする配列テーブルは次のような集団項目です。

    [図データ]

    このとき,6.で指定する領域がポイントするVARIANT値は,あらかじめCOBOLのデータ項目をCBLSETVARIANTサービスルーチンで変換しておいてください。3.で指定する領域中のOLEメソッドの文字列にパラメタを含める場合,またはOLEメソッドにパラメタがない場合は0を設定します。

戻り値

正常:0

上記以外:エラーコード値

注意事項

(a)

引数4の3.がポイントする文字列の中で,ピリオドで区切られているいちばん右側の文字列がOLEメソッドと判断されます。これ以外はすべてコレクションまたはコンテナと判断されます。

括弧で囲まれている場合は,そのOLEメソッドにパラメタが含まれていると判断され,引数4の5.で指定した配列テーブルは無視されます。

複数のパラメタを指定する場合は「,」で区切らなければなりません。

(b)

引数4の3.がポイントする文字列のOLEメソッドにパラメタを含めた場合,このサービスルーチンは次のように仮定します。

  • 「'」または「"」で囲まれているパラメタは文字列とする。

  • 0〜9と小数点のピリオドから構成される数値は倍精度浮動小数点とする。

(c)

パラメタの属性が(b)の方法で設定する仮定値と異なる場合は,引数4の5.にVARIANT値の配列テーブルポインタを設定してOLEメソッドのパラメタを指定してください。

使用例
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMOBJ USAGE ADDRESS.
       01 PRMVARIANT USAGE ADDRESS.
       01 PRMMETHODCALL.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 STRINGLENG PIC 9(9) USAGE COMP VALUE 48.
        02 STRINGNAMEPTR USAGE ADDRESS.
        02 VARTBLCNT PIC 9(9) USAGE COMP VALUE ZERO.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 VARTBLPTR USAGE ADDRESS.
       01 STRINGNAME PIC X(48) VALUE
          'InputBox(''Please Input Data'',
      -   '''COBOL InputBox'')'.
      *     :
       PROCEDURE DIVISION.
           COMPUTE PRMVARIANT = ZERO.
           COMPUTE VARTBLPTR = ZERO.
           COMPUTE STRINGNAMEPTR
                   = FUNCTION ADDR(STRINGNAME).
           CALL 'CBLMETHODCALL'
                USING BY VALUE ARG1
                      BY REFERENCE PRMOBJ
                                   PRMVARIANT
                                   PRMMETHODCALL.
注※

Windows(x64) COBOL2002では追加してください。

(g) CBLVARIANTINF

CBLGETPROPERTY,CBLMETHODCALL,およびCBLSETVARIANTサービスルーチンが得るVARIANT値の属性を取得するサービスルーチンです。CBLVARIANTINFは,取得した属性の値によってCBLSETCBLITEMサービスルーチンでの処理を選択するのに使用します。

形式
CALL 'CBLVARIANTINF' USING BY VALUE 引数1
                     BY REFERENCE 引数2 引数3 引数4.
引数
  • 引数1には,CBLOLE2INITで設定した引数1を指定します。

  • 引数2には,属性を取得するVARIANT値を設定します。

           01 引数2 USAGE ADDRESS.
  • 引数3には,VARIANT値から取得した属性値が設定されます。

           01 引数3 PIC 9(9) USAGE COMP.

    4バイトの2進項目で定義します。初期値としては0を設定します。

    この領域に返される属性値を次に示します。

    0:Empty値を表します。数値としては0,文字列としては長さが0であることを表します。COBOL2002では対応するデータ項目はありません。

    1:Null値を表します。有効な数値や文字列を持たないことを示します。値が0やEmpty値とは異なります。COBOL2002では対応するデータ項目はありません。

    2:整数型(Integer)を表します。COBOL2002では符号付き2バイト2進項目を表します。

    3:長整数型(Long)を表します。COBOL2002では符号付き4バイト2進項目を表します。

    4:単精度浮動小数点数型(Single)を表します。COBOL2002では単精度内部浮動小数点項目を表します。

    5:倍精度浮動小数点数型(Double)を表します。COBOL2002では倍精度内部浮動小数点項目を表します。

    6:通貨型(Currency)を表します。COBOL2002では対応するデータ項目はありません。CBLSETCBLITEMまたはCBLSETVARIANTで変換する場合は,英数字項目を指定します。

    7:日付型(Date)を表します。COBOL2002では対応するデータ項目はありません。CBLSETCBLITEMまたはCBLSETVARIANTで変換する場合は,21バイトの英数字項目を指定します。

    8:文字列型を表します。COBOL2002では対応するデータ項目はありません。CBLSETCBLITEMまたはCBLSETVARIANTで変換する場合は,英数字項目を指定します。

  • 引数4は,次の集団項目を要求します。

           01 引数4.
            02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.

    4バイトの2進項目で0を設定します。

戻り値

正常:0

上記以外:エラーコード値

使用例
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMOBJ USAGE ADDRESS.
       01 PRMVARIANT USAGE ADDRESS.
       01 PRMVARTYPE PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMGETPROPERTY.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 STRINGLENG PIC 9(9) USAGE COMP VALUE 43.
        02 STRINGNAMEPTR USAGE ADDRESS.
       01 STRINGNAME PIC X(43) VALUE
          'Workbooks(1).Worksheets(1).Cells(1,1).Value'.
       01 PRMVARIANTINF.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
           :
       PROCEDURE DIVISION.
           CALL 'CBLCREATEOBJ' USING …
           COMPUTE PRMVARIANT = ZERO.
           COMPUTE STRINGNAMEPTR
                   = FUNCTION ADDR(STRINGNAME).
           CALL 'CBLGETPROPERTY'
                 USING BY VALUE ARG1
                       BY REFERENCE PRMOBJ
                                    PRMVARIANT
                                    PRMGETPROPERTY.
           CALL 'CBLVARIANTINF'
                USING BY VALUE ARG1
                      BY REFERENCE PRMVARIANT
                                   PRMVARTYPE
                                   PRMVARIANTINF.

(h) CBLSETCBLITEM

CBLGETPROPERTYまたはCBLMETHODCALLサービスルーチンで取得したVARIANTの値を指定したCOBOLのデータ項目に変換し,設定するサービスルーチンです。

形式
CALL 'CBLSETCBLITEM' USING BY VALUE 引数1
                           BY REFERENCE 引数2 引数3.
引数
  • 引数1には,CBLOLE2INITで設定した引数1を指定します。

  • 引数2は,変換前のVARIANT値を設定します。

           01 引数2 USAGE ADDRESS.
  • 引数3は,次の集団項目を要求します。

           01 引数3.
            02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
            02 データ名1 PIC 9(9) USAGE COMP.        … 2.
            02 データ名2 USAGE ADDRESS.              … 3.
項目の説明
  1. 4バイトの2進項目で0を設定します。

  2. COBOLデータ項目に設定するVARIANT値の属性値を設定します。4バイトの2進項目で設定します。

    この領域に設定する値を次に示します。

    2:整数型(Integer)を表します。3.の領域がポイントする領域は次のような基本項目です。

      01 データ名 PIC S9(4) USAGE COMP.

    3:長整数型(Long)を表します。3.の領域がポイントする領域は次のような基本項目です。

      01 データ名 PIC S9(9) USAGE COMP.

    4:単精度浮動小数点数型(Single)を表します。3.の領域がポイントする領域は次のような基本項目です。

      01 データ名 COMP-1.

    5:倍精度浮動小数点数型(Double)を表します。3.の領域がポイントする領域は次のような基本項目です。

      01 データ名 COMP-2.

    6:通貨型(Currency)を表します。3.の領域がポイントする領域は次のような集団項目です(xx:文字列を格納するのに必要なバイト数)。

      01  データ名1.
        02  データ名2 PIC 9(9) USAGE COMP. … 4.
        02  データ名3 PIC X(xx).     … 5.

    4.には,5.の領域長を設定します。このサービスルーチンを正常に終了した場合,5.の領域に格納された文字列長が設定されます。5.の領域に文字列が格納できなかった場合は,5.の領域として必要な文字列長が設定され,エラーとなります。

    7:日付型(Date)を表します。3.の領域がポイントする領域は"6:通貨型"と同様な集団項目です。

    8:文字列型を表します。3.の領域がポイントする領域は"6:通貨型"と同様な集団項目です。

  3. 変換後の値を設定するCOBOLデータ項目領域のポインタです。アドレスデータ項目で定義します。この領域がポイントする領域については2.を参照してください。

戻り値

正常:0

上記以外:エラーコード値

変換規則

VARIANT値の属性とCOBOLデータ項目の属性とが異なる場合,変換はされません。

注意事項
  • 変換できないCOBOLのデータ項目を指定した場合,エラーとなります。

  • 事前にCBLVARIANTINFサービスルーチンで設定するVARIANT値を把握してから使用してください。

  • 通貨型,日付型の場合,COBOL2002では文字列として設定します。

使用例
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMOBJ USAGE ADDRESS.
       01 PRMVARIANT USAGE ADDRESS.
       01 PRMSETCBLITEM.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 VARTYPE PIC 9(9) USAGE COMP VALUE 8.
        02 CBLITEMPTR USAGE ADDRESS.
       01 CBLITEM.
        02 ITEMLENG PIC 9(9) USAGE COMP VALUE 255.
        02 ITEMSTRING PIC X(255).
           :
       PROCEDURE DIVISION.
           COMPUTE PRMVARIANT = VARIANT値.
           COMPUTE CBLITEMPTR = FUNCTION ADDR(CBLITEM).
           CALL 'CBLSETCBLITEM'
                USING BY VALUE ARG1
                      BY REFERENCE PRMVARIANT
                                   PRMSETCBLITEM.

(i) CBLSETVARIANT

CBLPUTPROPERTYまたはCBLMETHODCALLサービスルーチンでCOBOLのデータ項目を設定するため,VARIANT値に変換するサービスルーチンです。

形式
CALL 'CBLSETVARIANT' USING BY VALUE 引数1
                           BY REFERENCE 引数2 引数3.
引数
  • 引数1には,CBLOLE2INITで設定した引数1を指定します。

  • 引数2には,このサービスルーチンが生成した変換後のVARIANT領域のアドレスを設定します。

    この領域はアドレスデータ項目で定義します。また,初期値として0を設定します。

           01 引数2 USAGE ADDRESS.
  • 引数3は,次の集団項目を要求します。

           01 引数3.
            02 FILLER PIC 9(9) USAGE COMP VALUE ZERO. … 1.
            02 データ名1 PIC 9(9) USAGE COMP.        … 2.
            02 データ名2 USAGE ADDRESS.              … 3.
項目の説明
  1. 4バイトの2進項目で0を設定します。

  2. VARIANT値に変換するCOBOLデータ項目の領域の属性値を設定します。4バイトの2進項目で設定します。

    この領域に設定する値を次に示します。

    0:Empty値を設定します。3.の領域がポイントする領域には0を設定します。

    1:Null値を設定します。3.の領域がポイントする領域には0を設定します。

    2:符号付き2バイト2進項目を表します。3.の領域がポイントする領域は次のような基本項目です。

           01 データ名 PIC S9(4) USAGE COMP.

    3:符号付き4バイト2進項目を表します。3.の領域がポイントする領域は次のような基本項目です。

           01 データ名 PIC S9(9) USAGE COMP.

    4:単精度内部浮動小数点を表します。3.の領域がポイントする領域は次のような基本項目です。

           01 データ名 USAGE COMP-1.

    5:倍精度内部浮動小数点を表します。3.の領域がポイントする領域は次のような基本項目です。

           01 データ名 USAGE COMP-2.

    6:通貨型(Currency)を表します。3.の領域がポイントする領域は次のような集団項目です(xx:文字列を格納するのに必要なバイト数)。

           01 データ名1.
            02 データ名2 PIC 9(9) USAGE COMP. … 4.
            02 データ名3 PIC X(xx).     … 5.

    4.には,5.の文字列のバイト数を設定します。

    5.は文字列を格納します。

    7:日付および時間(Date/Time)を表します。3.の領域がポイントする領域は"6:通貨型"と同様な集団項目です。

           01 データ名 PIC X(21).

    8:文字列型(英数字項目)を表します。3.の領域がポイントする領域は"6:通貨型"と同様な集団項目です

  3. 変換するCOBOLデータ項目の領域のポインタです。アドレスデータ項目で定義します。この領域がポイントする領域については2.を参照してください。

戻り値

正常:0

上記以外:エラーコード値

注意事項

通貨型,日付型の場合,COBOL2002では文字列として設定します。

例えば,サーバがExcelの場合,日付型の設定では99/2/26 10:30という形式で設定してください。

使用例
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 ARG1 PIC 9(9) USAGE COMP VALUE ZERO.
       01 PRMVARIANT USAGE ADDRESS.
       01 PRMSETVARIANT.
        02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.
        02 CBLTYPE PIC 9(9) USAGE COMP VALUE 8.
        02 CBLITEMPTR USAGE ADDRESS.
       01 CBLITEM.
        02 ITEMLENG PIC 9(9) USAGE COMP VALUE 15.
        02 ITEMSTRING PIC X(15) VALUE 'OLE2 Automation'.
           :
       PROCEDURE DIVISION.
           COMPUTE PRMVARIANT = ZERO.
           COMPUTE CBLITEMPTR = FUNCTION ADDR(CBLITEM).
           CALL 'CBLSETVARIANT'
                USING BY VALUE ARG1
                      BY REFERENCE PRMVARIANT
                                   PRMSETVARIANT.

(j) CBLOLE2UNINIT

OLE2を終了させるサービスルーチンです。このサービスルーチンでは,CBLCREATEOBJやCBLGETOBJが生成したOLEオブジェクトや取得したOLEオブジェクトを終了できません。その場合は,このサービスルーチンを発行する前に,CloseやQuitなどOLE2オートメーションサーバ機能の終了メソッドを呼び出しておいてください。

また,このサービスルーチンを発行したあと,次のサービスルーチンを呼び出してはなりません。

  • CBLCREATEOBJ

  • CBLVARIANTINF

  • CBLGETOBJ

  • CBLOLE2UNINIT

  • CBLGETPROPERTY

  • CBLSETCBLITEM

  • CBLPUTPROPERTY

  • CBLSETVARIANT

  • CBLMETHODCALL

形式
CALL 'CBLOLE2UNINIT' USING BY VALUE 引数1
                           BY REFERENCE 引数2.
引数
  • 引数1には,CBLOLE2INITで設定した引数1を指定します。

  • 引数2は,次の集団項目を要求します。

           01 引数2.
            02 FILLER PIC 9(9) USAGE COMP VALUE ZERO.

    4バイトの2進項目で0を設定します。

注意事項

COBOLで作成したOLE2サーバに対して,このサービスルーチンを呼び出さないでください。

(3) エラーコード値

OLE2オートメーションクライアント機能で使用するサービスルーチンが正常終了した場合,RETURN-CODE特殊レジスタに0が戻されます。

サービスルーチンが異常終了した場合は,次のエラーコード値のどれかが戻されます。

表D‒2 エラーコード値

エラーコード値

エラーの内容

10

引数の値がNULLである。

13

ファイル名の拡張子がない。

14

プログラムIDが異なっている。

15

ファイル名,クラス名の指定が共にない。

18

Dispatchポインタが取得できなかった。

19

数値を構成する要素に誤りがある。

20

BSTR文字列を確保できなかった。

21

未サポートのVARIANTタイプが設定されている。

22

文字列を格納する領域が,文字列長よりも長い。

23

不当な日付が指定されている。

24

クラス名の指定がない。

25

サーバオブジェクトポインタが指定されていない。

26

OLEプロパティの指定がない。

27

OLEメソッドの指定がない

28

COBOLデータ項目の指定がない。

29

OLEプロパティに引数が指定されている。

30

引数VARIANTテーブルの指定がない。

31

VARIANT値とCOBOLデータ項目の型が不一致である。

32

設定できないVARIANT値が指定されている。

33

指定されたキーがオープンできない。

34

指定されたキーの値が取得できない。

35

指定されたキーがクローズできない。

その他の番号

OLEのシステムエラーが発生した。10進数のエラーコード値から,OLE関連のマニュアルでエラー状態を調べて対策する。

(4) 注意事項

OLE2オートメーションクライアント機能全般に関する注意事項について説明します。