Tech Note 05b: 共有ライブラリ内部特性

December 9, 2001

© NSB Corporation. All rights reserved.


[英語版]

NSBasicとCは非常に異なる種類の言語です。Cはコンパイル時にタイプをチェックする、コンパイル型言語です。NSBasicはコンパイル時およびダイナミックなタイプチェックを混ぜた、コンパイル型/解釈実行系の混在言語です。これにより、共有ライブラリを構築し使用する場合、ある規則に従う必要があります。単純にNSBasicで古い共有ライブラリを使用することはできません。幸い、それらの規則に従わない共有ライブラリを持っている場合、そのライブラリを包囲して、別の共有ライブラリを書くことができます。

共有ライブラリを書き始めるところでしたら、おそらく出発点としてPalmのSampleLibを使用したいと思うかもしれません。これはあまりよい考えではありません。SampleLibは、NSBasicでサポートしていないコンテキストを渡すメカニズムを持っています。従ってMathLib共有ライブラリから始めるほうがはるかによいでしょう。このライブラリのソースコードは自由にダウンロード可能です。http://www.radiks.net/~rhuebner/mathlib.html

オープン/クローズ ファンクション

オープンファンクションは次の内のどちらかのようになります。
Err OpenFunction(UInt16 refNum, UInt16 version) 
Err OpenFunction(UInt16 refNum)

NSBasicは両方を理解しますが、2つ目の形式の方が良いでしょう。最初の形式を使用する場合、バージョンは無視してください。ファンクションが正しく実行された場合、0を戻します。正しく実行されなかった場合、Palmのエラーコードを戻します。

クローズファンクションは次の内のどちらかのようになります。

Err CloseFunction(UInt16 refNum, UInt16 *useCount) 
Err CloseFunction(UInt16 refNum)

2つ目の形式の方が良いでしょう。最初の形式を使用する場合、このライブラリを継続して使っているアプリケーションの数をuseCountに入れて下さい。クローズファンクションは常に0を戻します。

パラメータ渡し

共有ライブラリ内の各Cファンクションは、NSBasicプロシージャあるいはNSBasicファンクションとして役割をすることができます。どちらにかわらず、CファンクションはErrタイプを戻さなくてはなりません。致命的なエラーが起こらない限りは、これは常に0です。

NSBasicプロシージャとして機能するファンクションは、いくつかの入力パラメーターを持つかもしれませんが、出力パラメーターは持ちません。入力パラメーターは次のタイプに限られるかもしれません。

最初の2つ(double と char *)は直接NSBasicタイプに置き換えられます。残りはインターフェースのグルーコードを使って処理されます。

次はよく構成されたプロシージャ定義の一例です。

Err LibSetKey(double key)

ファンクションは、パラメーターのリストの終わりに一つのリターンパラメータをもち、Cのリターンメカニズムを使用せずに、値を戻します。戻り値は次のタイプに限られるかもしれません。

char *を使用する場合、戻り値のために300バイトのスペースを持つことが確実です。あなたのライブラリがさらに大きな戻り値を戻す場合、NSBasicの中で呼ぶ側は、この戻り値の為に十分大きな文字列(string)を用意しなければなりません。また、ライブラリには、この事実をドキュメント化するべきでしょう。

次はよく構成された、一つの引数を渡し、一つのdoubleを受け取る、ファンクション定義の一例です。

Err LibCalcChecksum(char *input, double *output)

.inf ファイル

.infファイルは、共有ライブラリについての情報を提供します。既知の良い.infファイルから始めて、自分のアプリケーション用にそれを修正してください。MathLib用の.infファイルはNSBasicに付属しています。

各ファンクションまたはプロシージャは、.infファイルの中にラインを持っています。次の例は、2つのプロシージャ用のラインです。

LibSetKey=1, proc, 1, "Set the key to the first parameter"
LibCalcChecksum=2, func, 1, "Return the checksum of a single string"

This means the following:

LibSetKeyはプロシージャで、イコールの後の1はライブラリの中の1つ目のメソッドであることを示しています。さらに、1つの入力パラメーターを持っていて、最後の文字列はドキュメント用です。LibCalcChecksumはファンクションで、ライブラリの2つ目のメソッドです。それは1つの入力パラメーターおよびドキュメント用文字列を持っています。

注記

パラメーターのタイプに関して、.infファイルでは何も言わないことに注意してください。ですから共有ライブラリにあるプロシージャおよびファンクションを呼ぶ場合、非常に注意深くなければなりません。渡すパラメータは、共有ライブラリが定義しているものと同じタイプでなければなりません。これの最も安全な方法は、常に共有ライブラリのプロシージャおよびファンクションへ変数を渡すことです。式や定数は、実行時にどのタイプになるかを知るのが必ずしも可能でないので危険です。
誤:	
	y = sin(3.1415) 

正:
	x = 3.1415 
	y = sin(x)