第12回 広がる世界〜共有ライブラリを使ってみよう「5.広がる世界、開発者の輪」

12−5 広がる世界、開発者の輪

 さて、NS Basicは、ランタイムやIDEの機能拡張以外に、この共有ライブラリという方法で機能を拡張もしてきました。
その結果、随分と出来る事が多くなりましたが、それでも次の2つの理由で受け入れられていない部分があるようです。
  • やっぱり、機能が低いので・・・
  • ランタイム、ライブラリなど外部ファイルが多くて面倒
気軽にプログラムが組める半面、特に、詳しい方からはこういう評価を得てしまいがちなNS Basicです。
しかし、機能が低い、という点は、NS Basic側からC言語で書いたサブルーチンが呼び出すことで、ある程度カバーする事が可能です。
(ここページは、Basic BASICの域を完全に離れてしまいますので、分かる方だけ読んで頂ければ構いません。)

まず、NS Basic側から、他のアプリを呼び出すには、Chainコマンドを使います。
	Chain 0,"Memo Pad"
これで、プログラム中からメモ帳を起動できます。(先頭の 0はカード番号で、通常は 0です。)
ただし、メモ帳を呼び出したら、自分自身は終了してしまいますので、ランチャーとしては大丈夫でしょうが、サブルーチンとしてはちょっと使えません。
呼び出した所に戻ってくる関数は、
	Ret = AppLaunch(cardNo as Integer,pgm as string,cmd as integer,data as string)
です。AppLaunch()の戻り値Retが、サブルーチン側のReturen値になります。
カード番号cardNoは、通常 0で、pgmはプログラム名を指定します。cmdは、NS Basicユーザーの方は、通常 0にします。また、dataは、サブルーチン側に渡されるデータ文字列です。

次は、受け取り側です。
CodeWarriorなどでアプリを作られる方には予想がつくと思いますが、NS Basic側の引数cmdは、
	UInt32 PilotMain( UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags)
これに該当します。したがって、sysAppLaunchCmdNormalLaunch以外の処理も受けつけられる構造になっています。
ただし、単なるサブルーチンなのでUIを持たず、またアプリケーションではなく、ライブラリなので、sysAppLaunchCmdNormalLaunchだけを想定すればよいでしょう。
NS Basic側から与えられる引数は文字列なので、それなりの処理をする必要があることと、結果を整数で戻す必要がある点が若干面倒かもしれませんが、引数に対して、処理成功の真偽を返す程度なら、十分でしょう。
こちらの詳細は、http://www.nsbasic.com/palm/Japanese/technotes/TN07.htmにあります。
また、これらの使用例としては、厳達さんのCliCliClieの「Basic BASIC別館」にある「CSubLocalSendを使ってみる」が参考になります。

さて、これで、BASICとCの接点ができました。ある程度の機能拡張が望めるようになったら、残るは、ライブラリなどの外部ファイルをインストールしなければならないので面倒、という点ですね。
確かに、プログラム本体と、ランタイム、ライブラリの3ファイルをインストールさせるのは、ユーザーに「ちょっと面倒だな」という気を起させるには十分かもしれません。そこで、NS Basic Ver.2.11から搭載された新しい機能を紹介することにします(※注)。
これは、既存のファイルを「リソース(資源)」として、プログラム中に埋め込む事ができるようになった機能で、実は、NS Basic上では革命的な機能追加ではないかと思っています。
具体的には、

  

こんな感じにリソースとして、データベースやライブラリを組み込む事が出来ます。
これは、今までのビットマップなどと同様に、簡単に追加する事が可能です。

  

そして、そのプログラムのStartup Codeで新コマンドを使います。
	Dim res as integer
	res = DbCreateDatabaseFromResource("DBIM",1004)
これで、このライブラリが、実行時にPalmデバイスに組み込まれます。
組み込まれるというのは、HotSyncでインストールしたのと同様にPalmデバイス上にインストールされる、という事なのです。そう、必要なライブラリをアプリに含んだ形で配布する事が出来る訳です。
そもそも、NS Basic側のアプリに比べてライブラリ自体はそれほど大きなサイズではないので、組み込む事でのファイルサイズの増分は、それほど気にならないでしょう。
そして、もちろん、本来の使い方、データベースファイルをリソースとして扱う、という方法も可能です。
どうでしょうか?これで、ライブラリの組み込みの手間や、データベースの初期設定が楽になったのではないでしょうか?

さて、PalmのアプリでクリエータIDというモノがありますが、NS Basicユーザーの方は、重複してはならないコードと覚えていませんか?
でも、これは、アプリケーションタイプが「appl」であるモノの話で、ライブラリやデータファイルでは同じクリエータIDを持っても、全然問題がありません。
これと新機能を利用すると、自分だけのサブルーチンをアプリケーションに組み込む事が可能です(ただし、作れれば、という前提ですが)
まず、NS BasicアプリのクリエータIDとCサブルーチン側のクリエータIDを同じに設定します。Cサブルーチン側のアプリケーションタイプを例えばlibrなどにすれば、準備OKです。
次に、このCサブルーチンをリソースとしてNS Basicアプリに組み込んで使います。これで、Cサブルーチンをインストールしなくても、NS Basicアプリと同時にインストールされ、機能は使えるようになります。
そして、もし、NS Basic側のアプリがアンインストールされれば、同一クリエータIDを持ったライブラリも削除され、ゴミファイルは残らないことになります。
まさに、プライベートサブルーチンですね。

そんな訳で、新機能が追加され、より、拡張性を増したNS Basic、如何でしょうか?
今回は、Basic BASICとしては異色の内容かもしれませんね。そんな事で、次のネタを考えつつ、今回は終わりたいと思います。

※注:本稿執筆時、Ver.2.11は未リリースです。したがって、正規版リリースまで、この12-5に関する質問を各種掲示板へしないようにお願いします。また、正規版リリース時に、内容が変更となる場合もありますので、予めご了承下さい。





前へ     目次へ

第12回 広がる世界〜共有ライブラリを使ってみよう「5.広がる世界、開発者の輪」