18.6.2 DLLに含まれるプログラムの呼び出し方法
DLLに含まれるプログラムの呼び出しには,静的なリンクによる呼び出しと,動的なリンクによる呼び出しの二つの方法があります。
- 〈この項の構成〉
(1) 静的なリンク
呼び出し元プログラムのリンク時にインポートライブラリを指定して,呼び出し先プログラム名を解決する方法です。この場合,実行可能ファイルがロードされるときに,DLLもロードされます。
DLLを静的にリンクするには,呼び出し元プログラムから定数指定のCALL文で,呼び出し先プログラムのDLLを呼び出します。
ロード対象のDLLは次のDLL検索フォルダ下から順に検索されます。
-
現在のプロセスの実行可能ファイルがあるフォルダ
-
Windowsのシステムフォルダ
-
Windowsフォルダ
-
カレントフォルダ
-
環境変数PATHで登録されているフォルダ
プログラム実行時,これらの検索パスにDLLがないと,プロセス起動エラーとなります。
-DynamicLink,Callオプションを指定していない定数指定のCALL文を実行することで,静的なリンクによって呼び出しを行います。
- (例)
-
副プログラムを含むDLLがCALL '定数'で呼ばれ,実行可能ファイルの作成時にインポートライブラリを指定してDLLをリンクした場合,静的なリンクでの呼び出しとなります。
(2) 動的なリンク
実行時に呼び出し先プログラムを検索する方式です。
DLLを動的にリンクするには,次のどれかの文を実行しDLLに含まれるプログラムを呼び出すか,またはそのアドレスを求めます。
-
一意名指定のCALL文
-
-DynamicLink,Callオプション指定時の定数指定のCALL文
-
-DynamicLink,Callオプション指定時のADDR関数
動的なリンクの場合,プログラム実行時に環境変数CBLLDLLで呼び出し先プログラムが含まれるDLLを指定します。
- 形式
CBLLDLL=DLL名称[;DLL名称]…
- DLL名称
-
動的にリンクするDLLの名称を指定します。
- 規則
-
DLL名称の指定方法には,DLLのファイル名称だけを指定する方法と,フォルダを含めたファイル名称を指定する方法があります。
ファイル名称だけを指定した場合,動的なリンクの対象となるDLLは,次のDLL検索フォルダにある指定名称のDLLから順に検索されます。
-
現在のプロセスの実行可能ファイルがあるフォルダ
-
Windowsのシステムフォルダ
-
Windowsフォルダ
-
カレントフォルダ
-
環境変数PATHで登録されているフォルダ
フォルダを含めたファイル名称を指定した場合,指定したフォルダのDLLだけが動的なリンクの対象となります。
-
- DLL自動ロード機能
-
DLL自動ロード機能は,環境変数CBLLDLLの指定でプログラムが見つからなかった場合に,プログラム名.dllという名称のDLLをロードして,そのDLL中のプログラムを実行できるようにする機能です。
DLL自動ロード機能で一度ロードすれば,それ以降はDLL中のほかのプログラムをCALL文で呼び出せます。
DLL自動ロード機能を使用するためには,実行時環境変数CBLLPROGDLLにYESを指定します。環境変数の設定方法については,「36.2.1 実行時環境変数の設定方法」を参照してください。
環境変数CBLLDLLで指定したDLLに呼び出し先プログラムがない場合,CALL文で実行時エラーとなります。また,DLL自動ロード機能を使用する場合は,「呼び出し先プログラムの名称.dll」という名称のDLLがないとき,または「呼び出し先プログラムの名称.dll」に呼び出し先プログラムが含まれないときも,CALL文で実行時エラーとなります。
なお,動的なリンクのプレロード機能を使用することで,プログラム起動時に検索対象となるDLLをロードできます。動的なリンクのプレロード機能の詳細は,「18.6.3 動的なリンクのプレロード機能」を参照してください。
- (例)
-
一意名指定のCALL文での呼び出しの場合は,動的なリンクでの呼び出しとなります。
- 注意事項
-
-
環境変数の値は,プログラムで最初に呼ばれたCALL文の実行時に取得した値が,そのプログラム中で有効になります。
-
(3) 注意事項
-
プログラムを呼び出す場合,呼び出し先プログラムの呼び出し規約に従って呼び出さなければなりません。呼び出し規約が異なっている場合,静的なリンクのときは,リンク時にエラーとなり,動的なリンクのときは,実行時エラーとなります。
-
動的にロードされたDLLは,COBOL実行環境の終了時にアンロードされます。したがって,atexitシステム関数などで,COBOL実行環境の終了後のタイミングで呼び出される関数を登録する場合は,次の点に注意してください。
-
COBOL実行環境終了後のタイミングで呼び出される関数は,動的にロードされるDLLに含まれる関数であってはなりません。
-
-
Windows(x86) COBOL2002では,呼び出し先プログラムがSTDCALL呼び出し規約の場合,CALL文に指定されたプログラム名に装飾名を付けて呼び出されます。COBOL以外のプログラムをSTDCALL呼び出し規約にする場合は,プログラム名に装飾名を付けてエクスポートしなければ動的なリンクでは呼び出されません。詳細は,「35.2.1 DLLの作成」を参照してください。
(4) プログラムのデバッグ
実行可能ファイルに静的にリンクしたCOBOLプログラムと同様に,動的にリンクしたDLLについてもテストデバッガを使用したデバッグができます。
(5) 動的なリンクを使用するプログラム作成時の注意事項
プログラムの作成時には次のような注意が必要になります。
-
利用者定義関数を含めたDLLは,動的なリンク(プログラム呼び出した時にメモリにロードされるリンク方法)では呼び出せません。
プログラムの作成方法については,「35. 実行可能ファイルとDLLの作成」を参照してください。
(6) 動的なリンクを使用する場合の注意事項
ダイナミックリンクでは,独自にDLLのロードやアンロードを管理しています。そのため,プログラムの実行中に,DLLのロードやアンロードに関連するシステム関数(LoadLibrary,FreeLibrary)を,ユーザプログラムから呼び出してはなりません。