35.3.2 -StdCallオプションとstdcall呼び出し指示ファイル(Windows(x86) COBOL2002で有効)
stdcall呼び出し規約のプログラムを呼び出す場合,呼び出す側の呼び出し規約もstdcallにする必要があります。呼び出すプログラム側で呼び出し規約をstdcallにするには,COBOLソース中に指定する方法(CALL-CONVENTION句)と,stdcall呼び出し指示ファイルを使用する方法の2種類があります。
- 呼び出し属性をCOBOLソース中に指定する方法
-
呼び出し規約をCOBOLソース中に指定する方法です。環境部のEXTERNAL-PROGRAM SECTIONのCALL-CONVENTION段落で指定します。
指定方法の詳細については,マニュアル「COBOL2002 言語 拡張仕様編」 「25.2.1 プログラム間連絡機能の環境部」,および「18.4.2 呼び出し規約を参照してください。
- 呼び出し属性をstdcall呼び出し指示ファイルで指定する方法
-
stdcall呼び出し指示ファイル(.cbw)は,COBOLプログラムからstdcall呼び出し規約で呼び出すDLLのプログラム名を登録しておくためのファイルです。このファイル中に記述したプログラムは,COBOLプログラムからstdcall規約で呼び出されます。
この方法は,呼び出し規約を言語仕様でサポートする前に使用していた方法です。このため,特に理由がない場合は,呼び出し属性をCOBOLソース中に指定する方法を使用することを推奨します。
(1) コンパイル方法
作成したstdcall呼び出し指示ファイルを有効にするためには,コンパイル時に-StdCallオプションを指定する必要があります。
-StdCallオプションを指定すると,stdcall呼び出し指示ファイルがあれば使用されます。また,-StdCallオプションの指定がなければ,stdcall呼び出し指示ファイルがあっても無視されます。
(2) stdcall呼び出し指示ファイルの規則
- stdcall呼び出し指示ファイルの作成規則
-
-
stdcall呼び出し指示ファイル名は,ソースファイル名.cbwとし,ソースファイルと同じフォルダに格納しておく必要があります。※
- 注※
-
-StdCallFileオプションを使用すれば,任意のフォルダに格納されている任意の名称のstdcall呼び出し指示ファイルを指定できます。
-
- stdcall呼び出し指示ファイルの記述規則
-
stdcall呼び出し指示ファイルには,呼び出すDLLのプログラム名をテキストエディタを使用して記述します。このときの規則を次に示します。
-
プログラム名を複数記述する場合,プログラム名は改行して記述するか,または空白で区切って記述します。
-
ファイルの中にはコメントを1行単位に記述できます。コメントは,//の横に続けて記述します。
-
プログラム名の構成規則に反した文字を指定した場合,結果は保証しません。
-
stdcall呼び出し指示ファイル中にプログラム名が記述されていない場合,stdcall呼び出し指示ファイルがないものとして扱われます。
-
プログラム名を160バイト以上記述した場合,先頭から160バイトまでが有効となります。ただし,160バイト目と161バイト目が日本語となるときは,先頭から159バイトまでが有効となります。
-
-Compati85,Syntaxオプションを指定して,プログラム名を30バイト以上記述した場合,先頭から30バイトまでが有効となります。
-
プログラム名の変換規則に対する処理はされないため,プログラム名は変換規則適用後の文字で記述する必要があります。
-
プログラム名中の文字に対しては,COBOLの語の等価規則は適用されません。
-
.cbwファイルの記述例を次に示します。
- (例)
----+----1----+----2----+----3----+---- プログラム名 //コメント プログラム名 // コメント プログラム名 プログラム名 プログラム名 :
-
-Compati85,Syntaxオプションを指定している場合で,プログラム名を30バイト以上記述したときは,先頭から30バイトまでがプログラム名として有効となります。
-
(3) stdcall呼び出し指示ファイルの使用例
stdcall呼び出し指示ファイルを使用してプログラムをコンパイルする例を,次に示します。
- 使用例
-
- (DLLMAIN.cbl)
IDENTIFICATION DIVISION. PROGRAM-ID. DLLMAIN. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 DLLMODUL PIC X(7) VALUE 'DLLSUB2'. PROCEDURE DIVISION. * *** DLLモジュール CALL(定数呼び出し) CALL 'DLLSUB1'. * *** DLLモジュール CALL(一意名呼び出し) CALL DLLMODUL. * STOP RUN.
- (DLLSUB1.cbl)
IDENTIFICATION DIVISION. PROGRAM-ID. DLLSUB1. ENVIRONMENT DIVISION. DATA DIVISION. PROCEDURE DIVISION. * * STOP 定数文の実行 STOP 01. * EXIT PROGRAM.
- (DLLSUB2.cbl)
IDENTIFICATION DIVISION. PROGRAM-ID. DLLSUB2. ENVIRONMENT DIVISION. DATA DIVISION. PROCEDURE DIVISION. * * STOP 定数文の実行 STOP 02. * EXIT PROGRAM.
-
COBOLプログラム"DLLSUB1.cbl","DLLSUB2.cbl"をそれぞれ-Dll,Stdcallオプションを指定してコンパイルし,DLLを作成します。
ccbl2002 DLLSUB1.cbl -Dll,Stdcall -OutputFile DLLSUB1.dll ccbl2002 DLLSUB2.cbl -Dll,Stdcall -OutputFile DLLSUB2.dll
-
主プログラム"DLLMAIN.cbl"と同じフォルダにstdcall呼び出し指示ファイル"DLLMAIN.cbw"を作成し,-StdCallオプションを指定してコンパイルします。このとき,DLLSUB1を静的リンクするために,インポートライブラリDLLSUB1.libを指定します。
ccbl2002 -Main,System DLLMAIN.cbl -StdCall DLLSUB1.lib -OutputFile DLLMAIN.exe
- DLLMAIN.cbwの記述内容
// DLLSUB1.dllとDLLSUB2.dllを.cbwファイルに登録 DLLSUB1 DLLSUB2