静的にリンクされたコールアウト関数
このドキュメント内の前の章では、実行時にロードできるスタンドアロン・コールアウト・ライブラリを作成する方法を説明しました。ただし、コールアウト関数をカスタム・バージョンの Caché に静的にリンクして常に利用できるようにすることもできます。関数が Caché にリンクされているため、関数を呼び出すときにコールアウト・ライブラリを明示的にロードしたり、ライブラリを指定する必要はありません。
以下の項目について説明します。
-
静的にリンクされたコールアウト関数の呼び出し — 静的にリンクされた関数を使用する利点を説明します。
-
Windows でのカスタム CACHE.EXE ファイルの作成 — Visual Studio を使用してコールアウト・コードをカスタム・バージョンの Caché にリンクする方法を説明します。
-
UNIX®、Linux、または OS-X でのカスタム CACHE.EXE ファイルの作成 — コールアウト・コードをカスタム・バージョンの Caché にリンクする方法を説明します。
-
OpenVMS でのカスタム CZF.EXE ファイルの作成 — OpenVMS バージョンの Caché に組み込まれるコールアウト関数の標準セットを変更する方法を説明します。静的リンクは、OpenVMS では異なる意味合いを持ちますが、同じ利点があります。
静的にリンクされたコールアウト関数の呼び出し
静的にリンクされたコールアウト関数の呼び出し規則は、動的ライブラリの規則と異なります。以下はその例です。
$ZF(-3,"mylibrary","MYFUNC",args...)
上記は以下のようになります。
$ZF("MYFUNC",args...)
関数が静的にリンクされているため、サブ関数番号およびライブラリ名 (この例の、-3,"mylibrary" など) を指定する必要はありません。
Windows でのカスタム CACHE.EXE ファイルの作成
#define ZF_DLL 指示文を含まないという点を除いてコールアウト・ライブラリのコードと同一のコードを含む mycallouts.c という名前のファイルがあることを前提とします (“InterSystems コールアウト・ライブラリの作成” を参照してください)。これをコンパイルおよびリンクする手順は、以下のとおりです。
Windows で mycallouts.c をコンパイルするには、以下のコマンドを使用します。
cl -c mycallouts.c
これにより、Caché にリンク可能な mycallouts.obj という出力ファイルを生成します。
以下の方法で、$ZF で使用する C 関数をリンクします。
-
<install-dir>/Dev/Cache/callin ディレクトリ ( <install-dir> はユーザの構成のルート・ディレクトリ) で構築を実行するか、必要なファイルのコピーを使ってプライベート・ディレクトリを作成します。以下のファイルをリンクします。
-
cache.obj
-
main.obj
-
shdir.obj
プライベート・ディレクトリで mycallouts.c をコンパイルし、生成された mycallouts.obj ファイルにこれらのファイルをリンクします。
-
-
czf.obj ファイルを mycallouts.obj に置き換えます。
-
プロジェクトを構築します。これにより、プライベート・ディレクトリに cache.exe ファイルを生成します。別々のファイルに C 関数を配置している場合、それらを別々にコンパイルし、mycallouts.c で宣言する必要があります。しかし、そこには組み込みません。“Unresolved externals...” というメッセージが表示された場合、他のライブラリを組み込む必要があります。組み込むファイルについてサポートが必要な場合、インターシステムズのサポート窓口までお問い合わせください。
-
<install-dir>/bin ( <install-dir> はユーザの構成のルート・ディレクトリ) に現在インストールされている cache.exe を保存します。これにより、そのファイルをリストアできます。
以下の方法で、Caché を Windows に再インストールします。
-
キューブ・メニューの [Caché の停止] を使用して、Caché を停止します。
-
cache.exe ファイルをプライベート・ディレクトリから <install-dir>/binにコピーします。 <install-dir> は、ユーザの構成のルート・ディレクトリです。
Caché を再起動すると、関数が使用可能になります。
Windows では、Caché キューブから Caché を開始します。
現在の Caché バージョンは C 関数を組み込んでいます。
以下の方法で、(Windows 上の) Caché の管理者ディレクトリにある Caché をオリジナル・バージョンに戻します。
-
Caché をシャットダウンします。
-
cache.exe ファイルをプライベート・ディレクトリから <install-dir>/binにコピーします。 <install-dir> は、ユーザの構成のルート・ディレクトリです。
UNIX®、Linux、または OS-X でのカスタム CACHE.EXE ファイルの作成
#define ZF_DLL 指示文を含まないという点を除いてコールアウト・ライブラリのコードと同一のコードを含む mycallouts.c という名前のファイルがあることを前提とします (“InterSystems コールアウト・ライブラリの作成” を参照してください)。これをコンパイルおよびリンクする手順は、以下のとおりです。
mycallouts.c をコンパイルするには、以下のコマンドを使用します。
cc -c mycallouts.c
以下の方法で、$ZF で使用する C 関数をリンクします。
-
<install-dir>/dev/cache/callin/samples ディレクトリで構築を実行するか、必要なファイルのコピーでプライベート・ディレクトリを作成するかのいずれかを実行します。以下のファイルをリンクします。
-
cache.o (Caché 配布キットで提供されています)
-
main.o (Caché 配布キットで提供されています)
-
shdir.o (shdir.c を手動でコンパイルする必要があります)
-
mycallouts.o (プライベート・ネームスペースに作成されます)
-
-
プロジェクトを構築します。“Unresolved externals” メッセージを受け取った場合、他のライブラリを組み込む必要があります。組み込むファイルがわからない場合、インターシステムズのサポート窓口までお問い合わせください。別々のファイルに C 関数を置く場合、それらを別々にコンパイルし、mycallouts.c で宣言する必要があります。しかし、そこには組み込みません。
-
/cachesys/bin/ に (あるいは任意の場所のインストール・ディレクトリに) Caché のバージョンを保存します。これにより、必要に応じて Caché をリストアできます。
Caché 実行可能プログラムを置換するには、以下の手順に従います。
-
以下を実行し、Caché をシャットダウンします。
ccontrol stop <configname>
<configname> は、Caché のインストール名です。
-
cache ファイルをプライベート・ディレクトリから <install-dir>/bin/にコピーします。 <install-dir> は、ユーザの構成のルート・ディレクトリです。
cstart スクリプトを使用して、または以下を呼び出して Caché を開始します。
ccontrol start <configname>
<configname> は、起動したい Caché のインストール名です。
以下の方法で、Caché システム管理者のディレクトリにある Caché をオリジナル・バージョンに戻します。
-
Caché をシャットダウンします。
-
cache ファイルをプライベート・ディレクトリから <install-dir>/binにコピーします。 <install-dir> は、ユーザの構成のルート・ディレクトリです。
OpenVMS でのカスタム CZF.EXE ファイルの作成
既定では、OpenVMS 用の Caché は、既にいくつかのコールアウト関数を含む CZF.EXE という名前のイメージを含みます (標準 CZF.EXE 関数の説明は、“DSM に代わる $ZF 関数呼び出し” を参照してください)。
OpenVMS 下では (この章で説明しているその他のオペレーティング・システムとは異なり)、コールアウト・ライブラリはカスタム・バージョンの cache.exe に静的にリンクされません。代わりに、標準バージョンの CZF.EXE をカスタム・バージョンと置き換えます (“InterSystems コールアウト・ライブラリの作成 ” を参照してください)。標準バージョンのソース・コードは、カスタム・バージョンがそれを含めることができるように提供されています。
外部関数と Caché にリンクする CZF.OBJ ファイルを準備するには、DCL プロンプトから以下のコマンドを発行することによって CZF.C をコンパイルします。
$ CC CZF.C
CZF.M64 ファイルを使用している場合は、この時点でアセンブルして (“CZF.M64 の使用” を参照) CZF.OBJ を作成します。
CZFBUILD.com ファイルを使用して、外部関数にリンクします。CZFBUILD.com を編集し、リンクするファイルを追加します。編集前の CZFBUILD.com は以下のようになります。
LINK/NOTRACE/MAP=CZF/SHAREABLE=CZF SYS$INPUT:/OPTIONS
CLUSTER=CZF,,,CZF
GSMATCH=ALWAYS,0,0
SYMBOL_VECTOR=(ZFE=DATA)
-
CZFBUILD.COM を編集し、CZF.OBJ と各外部オブジェクト・ファイルを組み込みます。CZF ファイルで定義した外部関数を含む各ファイル名を、CZFBUILD.COM の 2 行目に追加します。例えば、関数が abc.obj と xyz.obj という 2 つのファイルにある場合、編集後の 2 行目は以下のようになります。
CLUSTER=CZF,,,CZF,ABC,XYZ
-
DCL プロンプトで CZFBUILD.COM を実行します。これにより、CZF.EXE ファイルを生成します。
コードが #include "callin.h" を実行し、Caché にコールバックする場合、Caché 共有可能イメージにもリンクする必要があります。
-
Alpha システムでは、CACHE /sharable を使用します。
-
Itanium システムでは、CKERNEL /sharable を使用します。
コマンドは、コマンド行ではなく、オプション・ファイル内で発行する必要があります。
以下のコマンドを発行します。
CCONTROL STOP <configname>
<configname> は、シャットダウンしたい Caché のインストール名です。
Caché 実行可能プログラムを共有メモリからアンロードし、CZF.EXE を置き換える必要があります。以下はそのコードです。
CCONTROL UNLOAD <configname>
<configname> は、アンロードしたい Caché のインストール名です。
プライベート・ディレクトリから <install-dir>:[bin] サブディレクトリに CZF.EXE をコピーします。以下はそのコードです。
COPY CZF.EXE DKA0:[CACHESYS.BIN]
Caché を再起動するには、以下のコマンドを発行します。
CCONTROL START <configname>
<configname> は、起動したい Caché のインストール名です。