はじめに
今回は、FileMakerの機能を拡張するソフトウェア「プラグイン」の開発方法について、簡単なサンプルを元に作成方法を解説していきます。
プラグインとは
プラグインとは、FileMakerに機能を追加するソフトウェアです。プラグインを利用すると、FileMakerの可能性をさらに広げることができます。
例えば、弊社が販売している「GN-File」というプラグインがあります。これはFileMaker上でファイルのコピーなど、フォルダ・ファイルを操作できるプラグインです。FileMakerのスクリプトでは基本的にフォルダ・ファイルを操作することはできませんが、プラグインを追加することでスクリプトからフォルダ・ファイルを操作できるようになります。
プラグインの概要
プラグインはクライアントのPCにインストールして利用します。拡張子は「fmx」です。プラグインの作成には、Windows版はCまたはC++、Macintosh版はXcodeを利用します。
サンプルを利用する
まずは、FileMakerのインストールCDに含まれているコードテンプレートをビルドして、プラグインをFileMakerにインストールしてみましょう。
ビルドの方法
- コードテンプレートはインストールCDに含まれています。
- 次に、このプロジェクトをビルドしてください。これで、プラグインプロジェクトのビルドは完了です。
インストール方法の確認
- 「日本語エキストラ\サンプル\FMExample\FMPlugInSDK\Example」フォルダにある「WinExampleD.fmx」ファイルを「FileMaker\FileMaker Pro 9 Advanced\Extensions」フォルダにコピーします。
- FileMakerを立ち上げます。
- メニュー編集の環境設定を選択します。
- プラグインタブをクリックし、プラグインが正しくインストールされたことを確認します。
外部関数を作成する
次は、簡単なプラグインのビルドの仕方を説明します。このプラグインに含まれる関数は次の通りとします。
- プラグインの実行中に、「Hello」 メッセージボックスを表示します。
- FileMakerから文字列を取得し、その文字列をFileMakerに返します。
環境は次の通りです。
- 言語: Microsoft Visual C++
- 開発環境: Microsoft Development Environment 2003
作成手順
次のステップを順番に行ってください。
- 「日本語エキストラ\サンプル\FMExample\FMPlugInSDK\Example」フォルダの「WinExample.vcproj」を実行してください。
- 「FMPlugInExample.cpp」を開いて、下図のように新しいStringIDをインサートします。
- 「FMPluginFunctions.h」を開いて、新しいFunctionIDを追加します。
- 「FMPluginFunctions.cpp」に下記の関数を定義します。
- 「FMPluinExample.rc」に定数の文字列をインサートします。
- FMPlugInExample.cppに新たにコマンドをインサートします。
- 「FMPluginFunctions.h」ファイルの外部関数を宣言します。
- 最後に 「サンプルを利用する」で述べたビルドとインストールを行ってください。
// The following strings are usually not localized, // but it is your option. 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, GNEXT_HelloID = 110 // New StringID };
// Function IDs enum { kXMpl_Add, kXMpl_Append, kXMpl_Evaluate, kXMpl_StartScript, kXMpl_UserFormatNumber, kXMpl_FormatNumber, kXMpl_NumToWords, kXMpl_Version, GNEXT_Hello // New FunctionID };
FMX_PROC(fmx::errcode) Do_GNEXT_Hello(short /* funcId */, const fmx::ExprEnv& /* environment */, const fmx::DataVect& dataVect, fmx::Data& results) { // System variable fmx::errcode errorResult = 0; // Store entered text fmx::TextAutoPtr resultTxt; resultTxt->SetText(dataVect.AtAsText(0),0, dataVect.AtAsText(0).GetSize()); // Show a hello message box MessageBox(NULL, "Hello", "Hello", MB_OKCANCEL); // Return value to FM results.SetAsText( *resultTxt, results.GetLocale()); return(errorResult); } // Do_GNEXT_Hello
// This string table is usually not localized, but it is your option. // STRINGTABLE BEGIN 102 "XMpl_Add( number1; number2 )" 103 "XMpl_Append( textToAppend... )" 104 "XMpl_Evaluate( calcToEvaluate )" 105 "XMpl_StartScript( filename; scriptname )" 106 "XMpl_UserFormatNumber( textOrNumber )" 107 "XMpl_FormatNumber( formatString; textOrNumber )" 108 "XMpl_NumToWords( number )" 109 "XMpl_Version" 110 "GNEXT_Hello( text )" // String constant END
//GNEXT_HelloID Do_GetString(GNEXT_HelloID, name, true); Do_GetString(GNEXT_HelloID, prototype); err = fmx::ExprEnv::RegisterExternalFunction(*pluginID, GNEXT_Hello, *name, *prototype, 1, 1, regFunctionFlags, Do_GNEXT_Hello);
Do_PluginInit
関数にインサートしてください。FMX_PROC(fmx::errcode) Do_vnext_Hello(short funcId, const fmx::ExprEnv& environment, const fmx::DataVect& dataVect, fmx::Data& results);