トップ » 技術記事 » FileMaker プラグインインの作り方(1) - FileMaker のプラグインを作ってみる

FileMaker プラグインインの作り方(1) - FileMaker のプラグインを作ってみる

タグ: C++ FileMaker

MSのAccessと並んで人気のあるお手軽データベース「FileMaker」でプラグインを作る方法について紹介したいと思います。FileMaker Pro を購入すると、プラグインを作るための SDK が付属してきます。これを利用して簡単なプラグインを作る過程を紹介しようと思います。

今回は、FileMaker のプラグインを作成する方法を解説します。この原稿の執筆時の最新版は、FileMaker 9 ですので、ここでも最新版の9と、誰でも入手することのできる、Visual Studio 2008 Express Editionを使ってみます。(ちなみに、VS2008の Express Edition は、無料で入手でき、しかも、商用目的での使用制限もないそうです。)

今回の開発で使った開発環境
  • Windows Vista (2000/XPでも可)
  • FileMaker Pro9 SDK
  • Visual Studio 2008 Express Edition

FileMakerとは?

FileMaker は、手軽に導入ができて、ある程度のシステムまで対応可能なデータベース構築ソフトです。当初はカード型で平易なのがウリでしたが、バージョンアップを重ねるたびに、さまざまな機能(リレーショナルデータベース機能や、Web1公開機能、プラグイン機能など)が追加されてきました。現バージョンではカード型の平易さを残したまま、かなりの規模のデータベースを構築できるようになっています。

今回参考にしたページ

今回、以下のページを参考にしてプラグインを作成してみました。特に、CodeZineの特集はかなり参考になりました。

今回作るプラグインについて

はじめに、FileMaker に付属しているプロジェクトをコンパイルしてみます。その後、自分で関数を追加して、簡単な Hello World プラグインを作ってみます。さらにこれを改良して、少し実用的な命令、ファイルの圧縮を行う命令を追加してみたいと思います。

  • サンプルのコンパイルとインストール
  • Hello, World 命令の作成
  • ファイルの圧縮を行う命令を追加

サンプルのコンパイルとインストール

FileMaker の CD-ROM の「サンプル\FMExample\FMPlugInSDK\」には、プラグインを作成するためのSDKとサンプルプロジェクトが用意されています。これをデスクトップなど適当なパスにコピーします。そして、サンプルプロジェクト「WinExample.vcproj」をVisual Studioで開きます。このプロジェクトファイルは、旧いバージョンのものなので、Visual Studioの変換ウィザードが開き、自動的に VS2008の形式に変換してくれます。

そして、変換が無事終わって、そのままコンパイルすると、プラグインが完成・・・すると期待するのですが、実は、Visual Studio 2008 Express Editionを使う場合には、FileMaker に標準添付しているサンプルプロジェクトでエラーが出ます。

ファイル「FMPluginExample.rc」の「#include "afxres.h"」の行で、このファイルが見つからない旨のエラーが出ます。そこで、この行を「#include "windows.h"」と書き換えます。これによってエラーがでなくなります。(たぶん、Express Editionでのみ発生すると思います。)

http://aoikujira.com/demo/hakkaku/rc/20080525_filemaker-comp-error.png

一行修正するだけで、コンパイルはうまくいき、プロジェクトと同じフォルダに「WinExampleD.fmx」というファイルが生成されます。

http://aoikujira.com/demo/hakkaku/rc/20080525_fmx.png
プラグインのインストール

このファイルを、FileMaker の Extensions フォルダ(FileMaker 9ならば「C:\Program Files\FileMaker\FileMaker Pro 9 Advanced\Extensions」)にコピーすることで、プラグインを FileMaker に追加することができます。プラグインの追加は、ファイルをコピーするだけなので非常に簡単です。(ただし、Windows Vistaの場合には、Program Files以下にファイルをコピーするだけなのに認証を求められますので、フォルダのプロパティで書き込み権限を変更しておくとデバッグがやりやすくなるでしょう。)

プラグインが正しく認識されているか確かめる

正しく、プラグインが認識されているかどうか確かめるには、FileMakerを起動させて、適当なデータベースを作ります。そして、メインメニューから[スクリプト - ScriptMaker]をクリックします。そして、スクリプトに適当な名前を付けて、画面左から「変数に値を設定」を選び、値の[指定]ボタンをクリックします。

http://aoikujira.com/demo/hakkaku/rc/20080525_scriptmaker.png

画面右上の[表示]ボックスから「外部関数」を選択すると、サンプルのプラグイン名と、プラグインで利用できる関数の一覧が表示されます。

http://aoikujira.com/demo/hakkaku/rc/20080525_external-func.png

Hello, World 関数の作成

では、サンプルのプラグインに独自関数「sayHello(名前)」を追加してみたいと思います。ここでは関数を1つ追加するだけですが、複数ファイルへいくつも定義を追加しないといけないので面倒です。はじめに箇条書きで概観してみます。

  • 文字列テーブルへの登録(FileMakerのメニューに表示するため)
    • 文字列IDを決める
    • 実際のリソースを定義
  • 関数の定義を登録(FileMakerに関数を登録するため)
    • 関数IDを決める
    • 実際の関数を定義(ヘッダファイルと定義ファイルに)
    • FileMakerに関数を登録する

私がうっかりしていたのは、文字列テーブルへの登録です。これは、FileMakerのメニューに自作関数が表示されるために必要です。

実際には、以下の手順で確認してみてください。

(1)文字列テーブル用のIDを設定する

プラグインのサンプルプロジェクト「WinExample.vcproj」のメインファイルは「FMPlugInExample.cpp」という名前です。このファイルにFileMakerから呼ばれるメイン関数「FMExternCallProc()」があります。ですので、はじめにこのファイルの編集から始めます。

「FMPlugInExample.cpp」の先頭では、文字列テーブルに使うIDを列挙型で宣言しています。これは、関数の説明などをリソースファイルから読み取るために設定するもので、文字列テーブルのIDを指定するもので、番号さえ重複しなければ、何番をつけても構いません。今回は「TEST_sayHelloID = 110」を追加しました。

// General String IDs
// ..
enum
{
	kXMpl_AddStringID = 102,
	kXMpl_AppendStringID = 103,
	kXMpl_EvaluateStringID = 104,
	kXMpl_StartScriptStringID = 105,
	kXMpl_UserFormatNumberStringID = 106,
	kXMpl_FormatNumberStringID = 107,
	kXMpl_NumToWordsStringID = 108,
	kXMpl_VersionStringID = 109,
	// 今回IDを追加した
	TEST_sayHelloID = 110
};
(2)リソースファイルに関数の使い方を追加

次に、先ほど指定したIDをリソースファイルに追加しましょう。VS2008のプロジェクトエクスプローラーから、Resource Filesにある「FMPluginExample.rc」を右クリックして「コードの表示」をクリックして開きます。そして、以下のように 110 番の文字列テーブルを追加します。これが、FileMakerの関数の説明として表示されます。

STRINGTABLE
BEGIN
    102 "XMpl_Add( 数字1; 数字2 )"

    103 "XMpl_Append( 追加するテキスト... )"
    104 "XMpl_Evaluate( 評価する計算式 )"
    105 "XMpl_StartScript( ファイル名; スクリプト名 )"
    106 "XMpl_UserFormatNumber( テキストまたは数字 )"
    107 "XMpl_FormatNumber( フォーマット; テキストまたは数字 )"

    108 "XMpl_NumToWords( 数字 )"
    109 "XMpl_Version"
    110 "TEST_sayHello( 名前 )" // ←今回追加した
END
(3)関数を識別するIDを設定する

次にプラグインの中で、関数を管理できるように、関数にIDをつけます。ファイル「FMPluginFunctions.h」を開いて、冒頭にある「Function IDs」に関数を識別する名前を追加します。

// Function IDs
	enum
	{
		kXMpl_Add,
		kXMpl_Append,
		kXMpl_Evaluate,
		kXMpl_StartScript,
		kXMpl_UserFormatNumber,
		kXMpl_FormatNumber,
		kXMpl_NumToWords,
		kXMpl_Version,
		// 今回以下を追加
		TEST_sayHello
	};
(4)関数の宣言を追加

同じくファイル「FMPluginFunctions.h」を開いて、宣言する関数のプロトタイプ宣言を行います。これは、Do_XMpl_Version のプロトタイプ宣言をコピーして、関数名だけを書き換えたものです。

//...
FMX_PROC(fmx::errcode) Do_XMpl_NumToWords(short funcId, const fmx::ExprEnv& environment, const fmx::DataVect& dataVect, fmx::Data& results);

FMX_PROC(fmx::errcode) Do_XMpl_Version(short funcId, const fmx::ExprEnv& environment, const fmx::DataVect& dataVect, fmx::Data& results);

// 今回以下を追加
FMX_PROC(fmx::errcode) Do_TEST_sayHello(short funcId, const fmx::ExprEnv& environment, const fmx::DataVect& dataVect, fmx::Data& results);
(5)関数の定義(実体)を追加

次に、プラグインの関数を定義した「FMPluginFunctions.cpp」へ「Do_TEST_sayHello()」の実体を追加します。このファイルには、他にもサンプルとしてさまざまな関数が定義されていますから、非常に参考になります。

以下は「Do_TEST_sayHello()」の関数の実体です。関数なので、ソース中のどこに貼りつけても大丈夫です。

FMX_PROC(fmx::errcode) Do_TEST_sayHello(
	short funcId,
	const fmx::ExprEnv& environment,
	const fmx::DataVect& dataVect,
	fmx::Data& results)
{
	fmx::errcode errorResult = 0;

	// 先頭にある引数を取得する
	fmx::TextAutoPtr param;
	param->SetText( dataVect.AtAsText(0), 0, dataVect.AtAsText(0).GetSize() );
	// 取得した Text 形式のデータをローカル変数にコピー
	char buf[4096];
	param->GetBytes(buf, 4096);
	strcat_s(buf, 4095, "さんこんにちは!");
	// メッセージボックスを表示
	MessageBox(0, buf, "Hello!", MB_OK);

	return(errorResult);
}

簡単にプログラムの内容を紹介します。FileMakerで自作関数が呼ばれると、この関数が実行されます。そして、その際の引数が、第3引数(DataVect型)に得られます。これは名前からも分かる通り配列形式で収められています。そして実際にその値を得るときには、ここでしているように、はじめに「fmx::TextAutoPtr」型の変数を定義して、そこに引数の内容をコピーします。(試していませんが、たぶん勝手に内容を書き換えない方が良いと思います。)もし、値を返したい時には、引数 results に返したい値を設定します。

(6)FileMakerに関数を登録する

関数を定義しただけでは、FileMakerから作った関数を認識させることはできません。最後に、FileMakerに関数を登録しましょう。

メインファイルの「FMPlugInExample.cpp」を開いて、関数「Do_PluginInit()」を探してください。ここで、関数をFileMakerに登録する処理が記述されています。

Do_GetString(kXMpl_VersionStringID, name, true);
Do_GetString(kXMpl_VersionStringID, prototype);
err = fmx::ExprEnv::RegisterExternalFunction(*pluginID, kXMpl_Version, *name,
	*prototype, 0, 0, regFunctionFlags, Do_XMpl_Version );
//以下、今回追加
Do_GetString(TEST_sayHelloID, name, true);
Do_GetString(TEST_sayHelloID, prototype);
err = fmx::ExprEnv::RegisterExternalFunction(*pluginID, TEST_sayHello, *name,
	*prototype, 1, 1, regFunctionFlags, Do_TEST_sayHello );

引数の中に、1,1 という箇所がありますが、これは、引数を1つ取る関数を定義するという意味になります。

(7)FileMaker から関数を削除する

関数を登録したら、登録を削除する処理も記述しましょう。同じく「FMPlugInExample.cpp」で、関数「Do_PluginShutdown()」に以下を追記します。

err = fmx::ExprEnv::UnRegisterExternalFunction(*pluginID, TEST_sayHello );

ここまで作業したら、コンパイルします。

(8)FileMakerにインストールして結果を確認

FileMakerのExtensionsにコピーしたら、ScriptMakerで「変数を設定」を選びます。

http://aoikujira.com/demo/hakkaku/rc/20080525_scriptmaker2.png

そして、値のところに「TEST_sayHello( "test" )」と記述します。

http://aoikujira.com/demo/hakkaku/rc/20080525_scriptmaker3.png

最後にスクリプトを実行すると、挨拶をする関数が完成しました。

http://aoikujira.com/demo/hakkaku/rc/20080525_hello.png

まとめ

このように、手順さえ分かってしまえば、FileMakerのプラグインを作るのは、それほど難しくはありません。(C++の知識は必要ですが。)本稿を参考に、いろいろなプラグインを作ってみてください。次回は、もう少し実践的な例として圧縮・解凍を行うプラグインを作ってみます。

Series NavigationFileMaker で ZIP の圧縮解凍プラグインの作成»

執筆者紹介

クジラ飛行机

クジラ飛行机

くじらはんど(http://kujirahand/)にて、日本語プログラミング言語「なでしこ」(IPA未踏ユース採択)、テキスト音楽「サクラ」(OSPオンラインソフト大賞入賞)など多くのオンラインソフトを開発。著書に「Flexプロフェッショナルガイド」「なでしこ公式バイブル」、「一週間でマスターするActionScript3.0」など。

TrackBack URL :