3.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コマンドを用いる方法があります。次のどれかの方法でサービス関数をエクスポートしてください。
- libコマンドまたはlinkコマンドで指定するオブジェクトファイル内で,__declspec(dllexport)でサービス関数名を定義する。
- libコマンドで,/EXPORT:サービス関数名を指定する。
- libコマンドで,/DEF:モジュール定義ファイルを指定し,モジュール定義ファイル中にEXPORTS文形式でサービス関数を定義する。
作成例については,次のサンプルソース(メイクファイル)を参照してください。
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共用ライブラリのサーチ処理が行われます。なお,次の検索パスは,優先度の高い順に並んでいます。
- UAPが存在するフォルダ
- UAPのカレントフォルダ(%DCDIR%¥tmp¥home¥各サーバのフォルダ)※1
- Windowsのシステムフォルダ※2
- Windowsフォルダ※2
- プロセスサービス定義のprcsvpath定義コマンドに指定したフォルダ
フォルダが複数指定されている場合,最初に検索されたフォルダ下の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共用ライブラリサーチパスを変更する場合に分けて,サービス関数の入れ替え方法を説明します。
- ユーザサービス定義を変更する場合
- 稼働中の該当するユーザサーバをdcsvstopコマンドで終了します。
- 該当するユーザサーバのユーザサービス定義のserviceオペランドを変更します。
- dcsvstartコマンドで該当するユーザサーバを開始します。
- UAP共用ライブラリサーチパスを変更する場合
- 稼働中の該当するユーザサーバを,dcsvstopコマンドで終了します。
- 新しいUAP共用ライブラリ格納フォルダに,UAP共用ライブラリを配置します。
- prcpathコマンドで,UAP共用ライブラリサーチパスを,新しいUAP共用ライブラリ格納フォルダに変更します。
- dcsvstartコマンドで該当するユーザサーバを開始します。
(b) サービス関数の入れ替え後の確認
新しい実行形式ファイルの起動時刻を確認し,dcsvstartコマンドまたはscdrsprcコマンドの実行時刻と比較してください。
新しい実行形式ファイルの起動時刻は,次の手順で確認します。ここでは,Windows Server 2008の場合を例に記載しています。
- [スタート]-[ファイル名を指定して実行]を選択します。
- 「名前」に「Msinfo32.exe」を入力して実行すると,[システム情報]ダイアログボックスが開きます。
- [システム情報]ダイアログボックスの左ペインにある[ソフトウェア環境]-[実行中のタスク]をクリックします。
- 右ペインに表示されるファイルから実行形式ファイルを探し,開始時刻を確認します。
(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; |