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を戻します。
NSBasicプロシージャとして機能するファンクションは、いくつかの入力パラメーターを持つかもしれませんが、出力パラメーターは持ちません。入力パラメーターは次のタイプに限られるかもしれません。
最初の2つ(double と char *)は直接NSBasicタイプに置き換えられます。残りはインターフェースのグルーコードを使って処理されます。
次はよく構成されたプロシージャ定義の一例です。
Err LibSetKey(double key)
ファンクションは、パラメーターのリストの終わりに一つのリターンパラメータをもち、Cのリターンメカニズムを使用せずに、値を戻します。戻り値は次のタイプに限られるかもしれません。
char *を使用する場合、戻り値のために300バイトのスペースを持つことが確実です。あなたのライブラリがさらに大きな戻り値を戻す場合、NSBasicの中で呼ぶ側は、この戻り値の為に十分大きな文字列(string)を用意しなければなりません。また、ライブラリには、この事実をドキュメント化するべきでしょう。
次はよく構成された、一つの引数を渡し、一つのdoubleを受け取る、ファンクション定義の一例です。
Err LibCalcChecksum(char *input, double *output)
各ファンクションまたはプロシージャは、.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つの入力パラメーターおよびドキュメント用文字列を持っています。
誤: y = sin(3.1415) 正: x = 3.1415 y = sin(x)