Tech Note 05a: 共有ライブラリの一例

April 18, 2001

© NSB Corporation. All rights reserved.


[英語版]

Ron Glowka氏からこの情報を提供して頂きました。

最初に共有ライブラリ(Shared Library)のサンプルプロジェクトと、それを呼ぶNSBasicテストプログラムをダウンロードすると良いでしょう。

注意: 説明を始める前に警告があります。このサンプルにある1つのファンクション(SelectOneTime)は最新版のNSBRuntime.prcファイル(version 1.10.3以降)が必要になります。このruntimeはnsbasic-Palm BBSにある"Files"セクションからダウンロードできます。このファンクション(SelectOneTime)を試さないことも出来ます(それをクリックしないことです)。しかし、NSBRuntime v1.10.3を持たずにこのファンクションを試すと、プログラムを終了する時にシステムがロックするでしょう。私のシステムではソフトリセットですが、ユニットの後ろのリセットボタンを押さなくてはなりません。1.10.3がなくても動作は正常ですが、終了時に問題があり、1.10.3を使っている場合はすべて正常に動作します。

このサンプルはCodeWarrior v7に付いてきた共有ライブラリサンプルから取ってきてものです。これからNSBasic共有ライブラリには必要無いものを省き、追加コードと共にアレンジしてあります。変更する必要のない"標準/必須"コードは、容易に無視できるように、ファイルの一番最後に持ってきてあります。

このプロジェクトは他の共有ライブラリのテンプレートになるように作られたもので、すぐに実用的なものは含まれていませんが、共有ライブラリ作成の良いスタートポイントとなるでしょう。この参考にしたサンプルは、特定のライブラリ(サンプル:MSLfunc1(MSLはMySharedLibの意)を識別するファンクション名、変数、構造等すべてもっていました。私のサンプルではこれら全てを変更して、"THIS_"で始まるように変えました。"THIS"で始まるものはすべて、「この」ライブラリに属しています。このサンプルはNSBasic用ですし、NSBasicは情報には.infを使い、コードの中には識別子を使わないので、この"THIS"はあなたのライブラリに残して構いません。もしCプログラムからライブラリにアクセスする場合、他とかち合わないパブリック識別子を付ける必要があるでしょう。

ソースコードとプロジェクト名も"THIS"で始まります。自分のライブラリを別のプロジェクトディレクトリに分けて入れている場合は、これらの名前も自分のライブラリとして残して構いません。あなたのコードの他に変更しなければならないのは、正しいOutput File NameとCreator Idを持つ為に、CodeWarriorにある"PalmRez Post Linker"の"Targets"の設定です。

役に立つようにと、このサンプルは単純で包括的になるようにしました。globalおよびstatic変数は共有ライブラリでは使用できませんが、グローバルに真似たものは出来ます。これはコードを多少複雑にしますので、もし必要でなかったならばそれらを見る必要がないように、別のファイルにグローバルルーチンを入れてあります。しかしながら、グローバルを使う場合でも、"globals"構造にグローバル定義をし、必要であればそれらを初期化するだけです。(全ては0に初期化してあります)

上記のコメントが意味をなす為には、おそらくプロジェクトに目を通した方がようでしょう。

NSBasicから共有ライブラリーを使用する前に、"SLExample.inf"ファイルが"nsbasic\lib"ディレクトリーの中にあることを確かめてください。次に、どのようにライブラリが使われているか、NSBasicテストプロジェクト(SLTest.prj)を見てください。デバイスまたはPOSEにダウンロードする必要のあるファイルはSLExample.prcとSLTest.prcです。SLExample.prcは共有ライブラリで、データベースタイプ"libr"を持っている為、アプリケーションランチャー上には現われません。

この共有ライブラリの例におけるファンクションは比較的分かりやすく単純です。FldGetSelection...ファンクションはグローバル変数を使用しています。これは共有ライブラリーファンクションから1つの非文字列変数タイプだけを返すことができるからです。FldGetSelectionは、フィールド内の選択されたエリアの始まりと終わりの両方の位置を戻します。したがって、共有ライブラリーの例では、これを2つのファンクション(FldGetSelectionStartとFldGetSelectionEnd)へと分けます。FldGetSelectionStartファンクションは始まりと終わりの両方の位置を検索し、グローバル変数に両方を格納するが、始まりの位置だけを戻します。FldGetSelectionEndファンクションはグローバル変数へとアクセスし、FldGetSelectionStartファンクションによってそこに格納された終わりの位置を戻します。

このプロジェクトで分かった興味深いこと:

ここでもっと多くを説明することも出来たでしょうが、実際にサンプルのテストプログラムと共有ライブラリを分析してみて下さい。ご質問には喜んでお答えします。

Ron