※下記内容は、過去のintra-mart(Ver4.3以前)に関する内容です。
最新のintra-martでは、異なる情報であることがありますので、ご注意ください。
通常、intra-mart を Web Application Server として実行していて、時として他のプログラムと連携したいと思うことがあります。
この"他のプログラム"ですが、JAVA で作られたプログラム(class)である場合には、JavaScript から直接呼び出すことができるので、非常に簡単に連携をすることができるのですが、JAVA 以外のプログラム・・・例えば C 言語などで作られたプログラムやOSの実行コマンドなどと連携する場合には、少し工夫が必要になります。
さて、ここからは外部プログラムの種類別に連携の手法を簡単に説明していきます。
intra-mart と連携する外部プログラムの種類は大きく3種類に分けることができます。
1つめは『JAVA プログラム』、2つめは『外部ライブラリ(*.dll や *.so など)』、そして3つめは『外部プロセス』になります。
1つめの『JAVA』との連携は、APIリストの[BaseModule Developer's Guide]-[その他]-[JAVA クラスの利用]に具体的な連携手法が説明されていますが、JavaScript から呼び出す場合には、パッケージおよびクラス名を決められた形式で指定することによって簡単に連携させることができます。
この時注意が必要なのは、引数および返却値の扱いです。
引数に渡す値は、JAVA および JavaScript 間で親和性の高い型の変数のみの受け渡しに限定されてしまいます。具体的には、文字列(String)、数値(number)、そして真偽値 (boolean)型のみとなります。
JavaScript と JAVA の変数の対応表を以下に示します。
JavaScript | JAVA |
String | String |
number | int, long, float, double |
boolean | boolean |
この表から分かるように、特に注意が必要な変数型は数値型ということになります。
JavaScript の実行エンジンの中で JavaScript の数値型は、実は double として管理されていることから、JAVA との連携の際には int, float, double でやりとりするのがもっとも無難だと思われます。long 型でもデータの受け渡しはできますが、あまりにも大きい(または小さい)値を long 型として扱おうとした場合、数値の丸め込みが行われてしまう可能性がありますので、気をつけて下さい。
2つめは『外部ライブラリの利用』に関してです。
外部ライブラリの利用方法に関しては、APIリストの[BaseModule Developer's Guide]-[その他]-[外部ライブラリの利用]にその手法が解説されています。
特に注意点としては、これも引数や返却値などのデータ型になります。
外部ライブラリの場合には、C言語で作る場合が多くなると思いますが、外部ライブラリは JavaScript - JAVA- ライブラリという形で JAVA を介して呼び出されますので、それら3種類の言語間のデータ型の特性を考慮する必要が出てきます。
もっとも問題が発生しにくい変数型は int(16bit までの範囲)と String です。
ただし、String 型の場合、文字コードに関しては注意が必要になります。
それと、外部ライブラリを利用する場合には、intra-mart から外部ライブラリが参照できることが必須条件となりますので、OSの環境設定をしっかりと行うようにして下さい。
具体的には、以下のように設定を行います。
Windowsサーバ:
環境変数 Path に目的のライブラリファイル(.dll)を保存してあるディレクトリを追加設定する
UNIX 系 OS:
環境変数 LD_LIBRARY_PATH に目的のライブラリファイル(.so)を保存してあるディレクトリを追加設定するOSの種類によって設定方法が異なるので、注意して下さい。
また、intra-mart を実行する環境・・・(コンソールで立ちあげる場合とサービスやデーモンとして起動する場合では環境がまったく異なります)・・・に対して設定する必要が あることにも注意して下さい。
3つめは『外部プロセス』です。
これは、OSのコマンドだったり、そのコンピュータにある実行可能ファイルなどを指します。つまり、環境(OS)依存の実行プロセスということになりま す。
OSのコマンドとは、例えば Windowsサーバの場合には cd だったり dir などのことを言います。
また、実行可能ファイルは Windowsサーバ の場合には、*.bat や *.exe などであり、また UNIX 系OSの場合には、実行権限(x)の与えられているファイル(シェルファイルなど)ということになります。
外部プロセスの実行にはグローバル関数 execute() を利用します。
それでは、具体的なプロセス実行の方法に関して説明します。
・Windowsサーバ で bat ファイルを実行する場合
bat ファイルとは、実行させたいコマンド群を記述した定義ファイルです。
当然実行権限がありますので、コンソール上でコマンドとして指定することで bat ファイルに記述されたコマンド群を指定に従って実行させることができるわけです。
実行可能な外部プロセスということで、当然 intra-mart からも呼び出すことができます。
具体的な呼び出し方ですが、非常に簡単で execute() の引数に実行させたい bat ファイルを記述するだけで実現できます。
例えば以下のような test.bat ファイルを作ったとします。 *******************************************************
test.bat
-------------------------------------------------------
echo OK!!
*******************************************************
実行する場合には、execute("test.bat"); で呼び出せます。
試しに Debug.browse(execute("test.bat")); とプログラムすれば、実行結果を画面で確認することができます。
bat ファイル呼び出しの際の注意点としては、作成した bat ファイルを intra-mart から呼び出せるように環境変数 Path の通っているディレクトリに保存するということです。もしも Path の設定が適切ではない場合には、新しく Path を通すか、または既に Path の通っているディレクトリ内に移動またはコピーをしてから実行するようにして下さい。
・Windowsサーバ で実行可能ファイル(*.exe)を実行する場合
bat ファイルを実行する場合とまったく同じ要領で呼び出すことができます。
Path の通っているディレクトリ内に目的の実行ファイル(exe)を保存して、execute() 関数で実行します。
まったく実用向きではありませんが、例えばメモ帳で imart.ini を開くには、execute("notepad imart.ini"); とプログラムして実行すればサーバ画面にメモ帳を開くことができます。
・Windowsサーバ で dir コマンドを実行する場合
dir コマンドとは、ご存知のように外部コマンドではなく内部コマンドという形態で提供されています。
従って、通常のコマンド呼び出しの方法とは異なり、execute("dir") では実行させることができません。
内部コマンドというのは、みなさんもご存知のように command.com の中で定義されているコマンドですから、当然 command.com というプロセスの中からしか呼び出せないということになります。intra-mart というプロセスは、command.com というプロセスとは別に起動されていますから、dir コマンドを呼び出すためには、その前に command.com を実行が必然であるということはお気付きいただけると思います。
つまり、dir コマンドを実行するための記述は以下のようになります。
var recieve = execute("command.com /C dir");
返却値 recieve には dir コマンドを実行した結果取得された情報が格納されていますので、Debug.browse(recieve) などとして確認してみて下さい。
・UNIX 系OSでシェルファイルを実行する
シェルファイルとは、シェルコマンド群を記述したファイルです。
通常は、実行権限を与えてコマンドプロンプトから実行すると思いますが、intra-mart のプロセス内から呼び出す場合には、少々工夫が必要になります。
シェルファイルを実行する場合、シェルファイル自体が実行されるのではなくてシェルの中で読み込まれたシェルファイル中のシェルコマンド群が実行されま す。
つまり、シェルファイルを実行するためには、まずはシェルを呼び出す必要があるということです。
環境によって異なるとは思いますが、例えば以下のようなシェルファイルを作成したとします。
*******************************************************
test.shell
-------------------------------------------------------
#!/bin/csh
pwd
*******************************************************
このファイルを呼び出して実行させる場合には
execute("sh test.shell");
というふうにして記述します。
要するに、シェルを呼び出して引数としてシェルファイルを与えるわけです。
注意点としては、シェルの種類等はもちろんなのですが、作成したシェルファイルが intra-mart から呼び出せるように、参照権限や実行権限などを適切に設定するようにしてください。外部プロセスと連携をした場合の注意点としては、これもまた情報の受 け渡しに
なります。
外部プロセスは、コマンドとしての呼び出しになるので、引数もコマンドライン引数として指定することになりますから、当然文字列のみとなります。また、外 部プロセスからのレスポンスは外部プロセス中から標準出力や標準エラー出力に出力された情報・・・つまり、通常コンソール画面上に表示される情報のみとな りますので、その型は必然的に文字列型のみとなります。
それと、最重要注意事項として、この execute() という関数は、コマンドの実行とプロセスからの出力情報の取得という機能のみの仕様となっています。起動した外部プロセスに対して入力情報を渡すことはで きません。外部プロセスが標準入力からの入力待ち状態になった場合には、デッドロック状態となってしまいます。
くれぐれも対話式のプログラムを実行しないようにご注意下さい。このようにして多種多様な外部プログラムと連携をすることによって、intra-mart だけでは実現が難しかった問題を解決していくことができます。
JavaScript に限界を感じている場合には、ぜひ他のプログラムと連携するという手法を検討し、システムの可能性を広げてみてはいかがでしょうか?