タイトルFileMaker Developer 5を使う:プラグイン関数を作成するカテゴリーライブラリ, データベース
作成日2000/8/4 16:18:37作成者新居雅行
ファイルメーカーProでは、プラグインとして別途ソフトウエアを供給することで、機能を付け加えることができる。Webコンパニオンも実はプラグインで供給されているのだが、CあるいはC++言語でプログラミングした機能をプラグインとしてファイルメーカーProに追加することができるのである。1つの典型的な利用方法は、External関数を使ってプラグインに組み込んだプログラムを呼び出すことである。フィールド定義の式で、External関数を使って、自分でプログラムした処理を呼び出して計算処理に利用できると考えればよいだろう。また、アイドル時間中にもプラグインとして作ったプログラムを呼び出すこともできるので、単に拡張関数以外の用途にもプラグインは使えるはずだ。
FileMaker Developer 5では、このプラグインを作成するためのひな形となるものが提供されている。また、マニュアルにも1つの章を使ってプラグイン作成について記載されている。Macntosh版のDeveloperには、CodeWarriorのプロジェクトファイル、ヘッダファイル、ソースファイルが添付しており、Templateというほとんど機能が組み込まれていないスケルトンと、ある程度の機能を組み込んだサンプルという位置付けのFull Exampleが含まれている。いずれも、CodeWarrior Pro2向けのプロジェクトであるが、Pro5でもプロジェクトを変換すれば、即座にコンパイルできてプラグインが生成できる。68kおよびFAT、さらにx86向けのバイナリも、CodeWarriorを正しくセットアップしていればコンパイルできる。つまり、Macintosh版でWindows版のプラグインも生成はできるということだ。ある程度知識を得た上で、これらのソースを見れば、プラグインをどのように作っていけばよいかは判断できるだろう。また、自分で作る場合には、Templateをもとに作成を行えばよい。

プラグインは1つのファイルとして作成される。この1つのファイルを構成するために、いろいろなリソースやあるいはC言語かC++で作成されたプログラムを作ることになるが、詳細については、Developer版を購入してもらうとして、ここではポイントになることをまとめておこう。まず、プラグインのプログラムは、ファイルメーカーProの中から呼び出されることになり、いわばコールバックされるものであって、一般的なアプリケーションなどとは若干環境が違う。そうした部分は非常にややこしく面倒なところではあるのだが、付属のTemplateなどのプロジェクトをもとにすれば、ファイルメーカーProからプラグインへの引き渡しのプログラム部分はほとんど出来上がっている。だから、プログラマはとにかくプログラムの中身だけを作ればいいように準備されているのである。
ファイルメーカーProからプラグインへは、パラメータブロックを用いてパラメータの引き渡しが行われる。実際にファイルメーカーProからプラグインを呼び出すタイミングは5種類ある。それぞれ、ファイルメーカー起動時、ファイルメーカー終了時、そしてアイドル時、プレファレンスでの[設定]ボタンを押した時、そして、外部関数Externalで呼び出した時である。これらの場面ごとにパラメータブロックのメンバに異なる定数が入るので、それに応じてswitch文で分岐すればいいが、やはりその部分もすでにTemplateで作ってくれている。
起動時や終了時の呼び出しは、たとえば特定のハードウエアがないと機能しないような外部関数で、初期化や接続チェック、あるいはメモリの解放などを行うような時に使う。常に状態をチェックしながら作業したい場合には、アイドル時に処理を組み込むことになるだろう。そして、プラグインの動作の設定をユーザにさせたいような場合には、プレファレンス呼び出しを利用する。設定結果は適当にファイルを作ってもかまわないが、Mac OSで稼動させる分にはプラグインファイルのリソースフォークを使えるように、データが引き渡される。だから、設定値をリソースに保存しておいてもかまわない。プリファレンス呼び出しでは、通常はダイアログボックスが表示されるが、そのダイアログボックスはリソースに定義を行い、それを表示して処理されるようにプログラムを組む必要がある。つまり、普通にダイアログボックス処理プログラムをかかないといけない。
外部関数のExternalで呼び出しを行う部分がいちばんよく使われているかもしれない。Externalでは、引数を2つ取る。というか、2つの引数しかサポートしていないため、たとえば3つ引数を取りたいと思ってもそれはできない。また、2つは言っても、1つは呼び出す関数名を指定する。プラグインで、たとえば「MyFunc」という関数を定義したとする。それを式から呼び出すには「External("MyFunc",引数)」のように記述するため、つまりは関数に実際にデータとして与えることができる引数は1つに限られるということだ。また、Externalの第一引数では、プログラムの関数名を直接記述するのではない。STR#リソースにExternalの引数に記述する関数名を定義しておく。そうすることで、プラグインが呼び出された時に、STR#の定義の何番目の関数名で呼び出されたかをプログラムに通知する仕組みになっている。プログラムの側でswitch文で分岐するということが必要になる。1つのプラグインでは複数の関数を定義することができる。
引数が1つしか与えられないというのはある意味では非常に不便だが、サンプルにもあるように、通常は2つ目や3つ目の引数で与えるような情報を、プリファレンスのダイアログボックスで指定しておくということもできる。サンプルでは、数値に書式設定を行うというような関数があるが、書式を指定する文字列はプリファレンスで指定するという具合である。また、複数の関数呼び出しを組み合わせて、いくつかの引数をプログラムに渡すという手法も考えられるだろう。
関数の処理結果を戻すには、呼び出された時のパラメータブロックの戻り値のメンバに適切な値を設定すればよい。

以上がポイントになるので、こうした仕様に従って、作成するプラグインの設計を行い、プログラムを書くことになる。もちろん、リソースの作り方など細かいところは、ソースを見たり、ドキュメントの解説を見るなどして適切に設定しなければならない。設定項目がたくさんあるので、無計画に行き当たりばったりでやるのは効率が悪いだろう。ドキュメントに目を通して、必要な準備を整えてから、ソースをいじるのがいいというのは当たり前だがプラグイン作成にも通じる。Templateの中にはメッセージ表示などいくつかのサービスルーチンはあるが、重要なのはハンドルの取得などメモリ関連の処理はToolbox関数をそのまま使うのではなく、FMX_NewHandleなど、FMExtern.hファイルで定義されている関数名を使うことだ。このファイルは、最初から付属しており修正しないでプロジェクトに含めるように指示されている。どのような関数が用意されているのかをチェックしておく必要があるだろう。Webコンパニオンのようなプラグインを作るとすると、アイドル時の処理でポートをリッスンするという方法が考えられるが、加えてデータベースの中身を取り出してクライアントに戻すという機能を組み込む必要があると考えられる。サンプルやマニュアルを見る限りは、プラグイン中でデータベースのデータを取り出したり設計情報を取り出す方法は説明されていない。
必ずしもすべての開発者がプラグインを開発するということはないかもしれない。また、有償のものも含めて、さまざまなプラグインがあるので、そうした素材が利用できるかを検討することもあるだろう。どうしても解決できないことがある場合、プラグインを作ることになる。特定のアプリケーション環境のプラグインを作るとなると、仕様などを1から調べないといけないのでプログラマとしては気が重いと感じるところだろう。だが、Developer版に付属するTemplateやサンプルのプロジェクトは開いてメイクすればとりあえずプラグインが作られるほど、準備周到なのである。後はドキュメントに目を通すことになるので、状況を把握するのに1日あれば十分と言えるだろう。思った程複雑な世界ではないという印象だ。
関連リンク