ファイルメーカー プラグイン開発 その3
top-bnr

ファイルメーカー プラグイン開発 その3

   2015/08/04

いよいよコーディングになるのですが、細かく説明すると長くなりそうなので、ほどほどに書いていきます。

流れとしては、4つのファイルに追記していくことで進めていきます。

基本的に「追記 Strat」 ~「追記 End」 と囲ってある部分が追記部分になります。

 

①FMPluginExample.rc に追記

//追加 Strat
110 "XMpl_Test(関数名;パラメータ)"
//追加 End

プラグインC++01

 

 

画像上部の102~始まる番号が関数名となり、ファイルメーカーで表示されます。

プラグインC++02

128がプラグイン名で、129が編集→環境設定の「プラグイン」タブで選択時に

表示されるガイダンスメッセージになります。

 

②FMPluginFunctions.h の2か所追記

 

//追加 Strat
kXMpl_Test
//追加 End

 

//追加 Strat
FMX_PROC(fmx::errcode) Do_XMpl_Test(short funcId, const fmx::ExprEnv& environment, const fmx::DataVect& dataVect, fmx::Data& results);
//追加 End

プラグインC++03

 

画像に収まり切れていませんが、Do_XMpl_Testの右文字は、すぐ上の関数定義と

同じですので、コピー&ペーストしてください。

 

③FMPlugInExample.cpp に追記

【追加1】

//追加 Strat
kXMpl_TestStringID = 110
//追加 End

プラグインC++04

 

 

 

【追加2】

//追加 Strat
Do_GetString(kXMpl_TestStringID, name, true);
Do_GetString(kXMpl_TestStringID, prototype);
regFunctionFlags = fmx::ExprEnv::kDisplayCustomFunctions;
err = fmx::ExprEnv::RegisterExternalFunction(*pluginID, kXMpl_Test, *name, *prototype, 1, 15, regFunctionFlags, Do_XMpl_Test );
//追加 End

プラグインC++06

 

 

 

【追加3】

//追加 Strat
err = fmx::ExprEnv::UnRegisterExternalFunction(*pluginID, kXMpl_Test );
//追加 End

 

プラグインC++05

 

 

④FMPluginFunctions.cpp の32行目に追加

プラグインC++07

 

//追加 Strat
#define MAX_BUFF_SIZE 65535
#define ParamMax 1024

typedef struct Parameters{
    int paramcount; // パラメータ数
    char param01[ParamMax]; // パラメータ実態
    char param02[ParamMax]; // パラメータ実態
    char param03[ParamMax]; // パラメータ実態
    char param04[ParamMax]; // パラメータ実態
    char param05[ParamMax]; // パラメータ実態
    char param06[ParamMax]; // パラメータ実態
    char param07[ParamMax]; // パラメータ実態
    char param08[ParamMax]; // パラメータ実態
    char param09[ParamMax]; // パラメータ実態
    char param10[ParamMax]; // パラメータ実態
    char param11[ParamMax]; // パラメータ実態
    char param12[ParamMax]; // パラメータ実態
    char param13[ParamMax]; // パラメータ実態
    char param14[ParamMax]; // パラメータ実態
    char param15[ParamMax]; // パラメータ実態
} Parameters;

extern Parameters stParameters;

class stParam
{
    public:
    stParam(void);
    Parameters stParameters;

    int ParametersDecomposition(const fmx::DataVect& dataVect);

    public:
    ~stParam(void);
    };
    stParam::stParam(void)
    {
    }

    int stParam::ParametersDecomposition(const fmx::DataVect& dataVect)
    {
        //char szBuff[ParamMax];
        // 引数の数を保存
        stParameters.paramcount = dataVect.Size();;

        // 各引数格納変数を初期化
        memset(stParameters.param01,0x00,sizeof(stParameters.param01));
        memset(stParameters.param02,0x00,sizeof(stParameters.param02));
        memset(stParameters.param03,0x00,sizeof(stParameters.param03));
        memset(stParameters.param04,0x00,sizeof(stParameters.param04));
        memset(stParameters.param05,0x00,sizeof(stParameters.param05));
        memset(stParameters.param06,0x00,sizeof(stParameters.param06));
        memset(stParameters.param07,0x00,sizeof(stParameters.param07));
        memset(stParameters.param08,0x00,sizeof(stParameters.param08));
        memset(stParameters.param09,0x00,sizeof(stParameters.param09));
        memset(stParameters.param10,0x00,sizeof(stParameters.param10));
        memset(stParameters.param11,0x00,sizeof(stParameters.param11));
        memset(stParameters.param12,0x00,sizeof(stParameters.param12));
        memset(stParameters.param13,0x00,sizeof(stParameters.param13));
        memset(stParameters.param14,0x00,sizeof(stParameters.param14));
        memset(stParameters.param15,0x00,sizeof(stParameters.param15));

        // 第1引数(必須)の保存
        dataVect.AtAsText(0).GetBytes(stParameters.param01 ,sizeof(stParameters.param01));

        // その他引数の保存
        if( stParameters.paramcount > 1) {
            dataVect.AtAsText(1).GetBytes(stParameters.param02 ,sizeof(stParameters.param02));
            if( stParameters.paramcount > 2) {
                dataVect.AtAsText(2).GetBytes(stParameters.param03 ,sizeof(stParameters.param03));
                if( stParameters.paramcount > 3) {
                    dataVect.AtAsText(3).GetBytes(stParameters.param04 ,sizeof(stParameters.param04));
                    if( stParameters.paramcount > 4) {
                        dataVect.AtAsText(4).GetBytes(stParameters.param05 ,sizeof(stParameters.param05));
                        if( stParameters.paramcount > 5) {
                            dataVect.AtAsText(5).GetBytes(stParameters.param06 ,sizeof(stParameters.param06));
                            if( stParameters.paramcount > 6) {
                                dataVect.AtAsText(6).GetBytes(stParameters.param07 ,sizeof(stParameters.param07));
                                if( stParameters.paramcount > 7) {
                                    dataVect.AtAsText(7).GetBytes(stParameters.param08 ,sizeof(stParameters.param08));
                                    if( stParameters.paramcount > 8) {
                                        dataVect.AtAsText(8).GetBytes(stParameters.param09 ,sizeof(stParameters.param09));
                                        if( stParameters.paramcount > 9) {
                                            dataVect.AtAsText(9).GetBytes(stParameters.param10 ,sizeof(stParameters.param10));
                                            if( stParameters.paramcount > 10) {
                                                dataVect.AtAsText(10).GetBytes(stParameters.param11 ,sizeof(stParameters.param11));
                                                if( stParameters.paramcount > 11) {
                                                    dataVect.AtAsText(11).GetBytes(stParameters.param12 ,sizeof(stParameters.param12));
                                                    if( stParameters.paramcount > 12) {
                                                        dataVect.AtAsText(12).GetBytes(stParameters.param13 ,sizeof(stParameters.param13));
                                                        if( stParameters.paramcount > 13) {
                                                            dataVect.AtAsText(13).GetBytes(stParameters.param14 ,sizeof(stParameters.param14));
                                                            if( stParameters.paramcount > 14) {
                                                                dataVect.AtAsText(14).GetBytes(stParameters.param15 ,sizeof(stParameters.param15));
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        return(0);
    }

    stParam::~stParam(void)
    {
    }

    //関数宣言
    char *fnc_StrToUpper(char *s);
    void fnc_FileRename(stParam lParam,char* szRec);

    FMX_PROC(fmx::errcode) Do_XMpl_Test(short, const fmx::ExprEnv& , const fmx::DataVect& dataVect, fmx::Data& results)
    {
        char szRec[MAX_BUFF_SIZE];

        stParam lParam;
        fmx::errcode errorResult = 0;
        fmx::TextAutoPtr returnText;
        memset(szRec,0x00,sizeof(szRec));

        // 引数を分解する。
        lParam.ParametersDecomposition(dataVect);

        //ここに実際の処理を記述する。

        //ここかか
        if (strcmp(fnc_StrToUpper(lParam.stParameters.param01),"FILERENAME") == 0) {
            fnc_FileRename(lParam,szRec);
        }
        //ここまで
        // 選択ファイルをFM型に変換する。
        returnText->Assign(szRec,fmx::Text::kEncoding_ShiftJIS_Win);
        // 戻り値設定
        results.SetAsText( *returnText, results.GetLocale());

        return(errorResult);

    } // Do_XMpl_Test

    // 文字列中の英小文字を大文字に変換
    char *fnc_StrToUpper(char *s)
    {
        char *p;
        for (p = s; *p; p++)*p = toupper(*p);
        return (s);
    }

    //ファイル名を変更
    void fnc_FileRename(stParam lParam,char* szRec)
    {
        memset(szRec,0x00,sizeof(szRec));
        if(rename(lParam.stParameters.param02,lParam.stParameters.param03) != 0) {
            sprintf(szRec, "ERROR:renameに失敗しました。");
        }
        return;
    }
//追加 End

インデントが崩れていますが、面倒なのでこのまま・・・・

とりあえず、XMpl_Testという外部関数を作成しました。

設定としては、引数の1番目に処理名を設定し、2~15個までの引数に処理に必要な値を設定するように設定しました。

if (strcmp(fnc_StrToUpper(lParam.stParameters.param01),"FILERENAME") == 0)

この部分で処理名ごとに関数を切り分けて、この例ではfnc_FileRename関数を呼び出しています。

 

引数についてはクラスを作成し、char型に変換していますので

C言語などのサンプルから関数を追加しても良いかと思います。

処理結果についても、char型変数に保存し、ファイルメーカー側で受け取るようにしてあります。

 

もっと良いコーディングがあるとは思いますが、処理を追記したい場合は、FMPluginFunctions.cppのみ

修正すればよいので個人的には楽ですし、いろいろな関数を追加済みなのでいまさら

コーディングの最適化を行うのも、気が引けているのが現状です ^^;

 

 

プロジェクトのプロパティ設定を変更すれば.NET Frameworkなどの機能を利用することもできますので、

より幅広くファイルメーカーではできなかった機能を作ることができますので

長く本格的にファイルメーカーを使うには、必要なのではないでしょうか?

 

bottom-bnr
  • ブログランキング・にほんブログ村へ
  • FC2ブログランキングへ
  • 人気ブログランキングへ
  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る