3.5 サービス関数動的ローディング機能使用時のUAP共用ライブラリ

ここでは,サービス関数動的ローディング機能使用時のUAP共用ライブラリについて説明します。サービス関数動的ローディング機能の概要についてはOpenTP1シリーズのマニュアルを参照してください。

なお,サービス関数動的ローディング機能は,次の場合は使用できません。

<この節の構成>
(1) UAP共用ライブラリのエクスポート
(2) ライブラリサーチパスの処理
(3) ユーザサーバプロセスのサービス関数の入れ替え
(4) UAP共用ライブラリ名の指定
(5) サービス関数動的ローディング機能使用時のUAP共用ライブラリの注意事項

(1) UAP共用ライブラリのエクスポート

サービス関数がUAP共用ライブラリに存在する場合,ユーザサーバ起動時のUAP共用ライブラリに含まれる,ユーザサービス定義で指定するサービス関数は,必ずUAP共用ライブラリからエクスポートしてください。

エクスポートされていない場合(非常駐サーバの場合はプロセス起動時)は,次のように動作します。

SPPの場合
KFCA00344-Eメッセージを出力後,dc_rpc_mainloop関数がDCRPCER_FATAL(-303)でエラーリターンします。
MHPの場合
KFCA00344-Eメッセージを出力後,dc_mcf_mainloop関数がDCMCFER_FATAL(-11902)でエラーリターンします。

ユーザサービス定義で指定するサービス関数以外の関数のエクスポートは必須ではないため,処理形態に応じてエクスポートしてください。

UAP共用ライブラリから関数をエクスポートするには,libコマンドや,linkコマンドを用いる方法があります。次のどれかの方法でサービス関数をエクスポートしてください。

作成例については,次のサンプルソース(メイクファイル)を参照してください。

SPP開発言語と開発環境メイクファイル名称
C言語

%DCDIR%¥examples¥base¥aplib¥c¥make_svdl

COBOL言語COBOL2002

%DCDIR%¥examples¥base¥aplib¥cobol¥make_svdl

Net Express

%DCDIR%¥examples¥base¥aplib¥cobol¥makemf_svdl

(2) ライブラリサーチパスの処理

UAP共用ライブラリ名にUAP共用ライブラリ名称だけを指定する場合,OpenTP1は指定されたUAP共用ライブラリを,OSのライブラリサーチパスを基に検索して使用します。Windows上では,次の検索パスで,指定UAP共用ライブラリのサーチ処理が行われます。なお,次の検索パスは,優先度の高い順に並んでいます。

注※1
OpenTP1の管理する一時フォルダです。OpenTP1システムやUAPの起動時に削除されますので,このフォルダ下には作成したUAP共用ライブラリを格納しないでください。
注※2
WindowsシステムフォルダやWindowsフォルダに,作成したUAP共用ライブラリを格納することは推奨していません。格納しないでください。

次の例では,(b)のフォルダ下にあるUAP共用ライブラリがUAP上にローディングされます。

UAPの存在するパス名:c:¥user¥aplib¥user.exe
DLLの存在するパス名:c:¥opentp1¥aplib¥libusr.dll
           c:¥user¥aplib¥libusr.dll
<プロセスサービス定義>
prcsvpath c:¥opentp1¥aplib; c:¥user¥aplib
       (a)     (b)

(3) ユーザサーバプロセスのサービス関数の入れ替え

サービス関数動的ローディング機能の使用時は,オンラインを停止しなくてもユーザサーバのサービス関数を入れ替えられます。ここでは,サービス関数の入れ替え手順,および入れ替え後の確認手順について説明します。

(a) サービス関数の入れ替え

ユーザサービス定義を変更する場合と,UAP共用ライブラリサーチパスを変更する場合に分けて,サービス関数の入れ替え方法を説明します。

ユーザサービス定義を変更する場合
  1. 稼働中の該当するユーザサーバをdcsvstopコマンドで終了します。
  2. 該当するユーザサーバのユーザサービス定義のserviceオペランドを変更します。
  3. dcsvstartコマンドで該当するユーザサーバを開始します。
UAP共用ライブラリサーチパスを変更する場合
  1. 稼働中の該当するユーザサーバを,dcsvstopコマンドで終了します。
  2. 新しいUAP共用ライブラリ格納フォルダに,UAP共用ライブラリを配置します。
  3. prcpathコマンドで,UAP共用ライブラリサーチパスを,新しいUAP共用ライブラリ格納フォルダに変更します。
  4. dcsvstartコマンドで該当するユーザサーバを開始します。
(b) サービス関数の入れ替え後の確認

新しい実行形式ファイルの起動時刻を確認し,dcsvstartコマンドまたはscdrsprcコマンドの実行時刻と比較してください。

新しい実行形式ファイルの起動時刻は,次の手順で確認します。ここでは,Windows Server 2008の場合を例に記載しています。

  1. [スタート]-[ファイル名を指定して実行]を選択します。
  2. 「名前」に「Msinfo32.exe」を入力して実行すると,[システム情報]ダイアログボックスが開きます。
  3. [システム情報]ダイアログボックスの左ペインにある[ソフトウェア環境]-[実行中のタスク]をクリックします。
  4. 右ペインに表示されるファイルから実行形式ファイルを探し,開始時刻を確認します。

(4) UAP共用ライブラリ名の指定

ユーザサービス定義のserviceオペランドには,絶対パスと,ライブラリ名称の指定を併記できます。

ただし,絶対パスで指定したUAP共用ライブラリ名とライブラリ名称で指定したUAP共用ライブラリ名が同一の場合,記述する順序によってローディングされるUAP共用ライブラリパスが異なります。

先に指定する名称別に,次に説明します。

ライブラリ名称で指定したUAP共用ライブラリ名を先に記述する場合
ライブラリ名称で指定したUAP共用ライブラリに対し,ライブラリ名称で指定したパスの検索順序に従ってライブラリパスが検索されます。この結果,最初に検索されたフォルダ下のUAP共用ライブラリがローディングされます。
次に,絶対パスで指定したUAP共用ライブラリがローディングされます。
この指定順序の場合,2種の異なるUAP共用ライブラリがUAP上にローディングされます。
絶対パスで指定したUAP共用ライブラリ格納フォルダが最初に検索された場合は,同一のUAP共用ライブラリが2回ローディングされます。
絶対パスで指定したUAP共用ライブラリ名を先に記述する場合
まず,絶対パスで指定したUAP共用ライブラリがローディングされます。次に,ライブラリ名称で指定したUAP共用ライブラリをローディングしようと試みます。しかし,先に絶対パスで同一名称のUAP共用ライブラリがローディングされているため,絶対パスで指定したUAP共用ライブラリが再度ローディングされます。この指定順序の場合,絶対パスで指定したUAP共用ライブラリが,UAP上に2回ローディングされます。

(5) サービス関数動的ローディング機能使用時のUAP共用ライブラリの注意事項

ユーザサービス定義のserviceオペランドで指定したUAP共用ライブラリ内で,TLS(スレッドローカルストレージ)を使用した変数宣言をしないでください。次のようなコーディングを含むUAPオブジェクトがUAP共用ライブラリ内に存在する場合,該当する変数を参照するときに,アクセス例外が発生します。

__declspec(Thread) int sample;