このソースファイルはBCC 5.5.1+BCC Developer1.2.21を想定しています。nako_plugin_sdk.bdpをBCC Developerに読み込ませることで、簡単にコンパイルすることが出来ます
プラグインには以下の4つの関数が絶対必要です。
プラグインに必要なのは、以下の4つの関数です。
// プラグイン実行用の関数
void ImportNakoFunction(void);
// プラグインの情報
int PluginInfo(char *str,int len);
// プラグインのバージョン
DWORD PluginVersion(void);
// なでしこプラグインバージョン
DWORD PluginRequire(void);
なでしこに関数や文字列を追加するための関数で、プラグイン取り込み時に必ず実行されます。この手続きの中でなでしこの命令を定義すると良いでしょう。命令の定義の仕方については後述します。
プラグインの情報を返す関数です。作者情報やプラグインの名前を str へ最大 len 文字コピーしてください。
引数の意味
str : 情報文字列をコピーします。
len : 情報文字列取得のために確保されたバッファ長
戻り値:情報文字列の長さ
プラグインのバージョン情報を整数で返します。好きな数字を返しても大丈夫です。
なでしこプラグイン認識バージョンです。今のところ、バージョン1しか定義されていません。1以外の数値が返ってきたらバージョン違いのプラグインとして取り込みません。必ず1を返すように設計してください。
このソースファイルをひな形として、プラグインを作る方法を解説します。
まず、このフォルダのファイルを適当なフォルダにコピーして下さい。コピーするのは以下の通りdll_plugin_helper.cppdll_plugin_helper.hdnako_import.cppdnako_import.hdnako_import_types.cppdnako_import_types.hmain.cppnako_plugin_sdk.bdp
コピーしたら、nako_plugin_sdk.bdpを適当な名前にリネームして、BCC Developerで開いて下さい。
プラグイン用の関数は、コールバック関数として登録しますのである一定の形式にしておかなくてはなりません。以下がその形ですが、この関数から、別の関数を呼べば良いだけのことなので、それほど気にしないでください。
PHiValue __stdcall TestFunc(DWORD HandleArg);
PHiValueというのは聞きなれない名前の型ですが、なでしこでは、この型を標準の型として表します。
この型から整数を得る場合には、hi_int(PHiValue)とか、文字列の場合は、hi_str(PHiValue)とキャストのようにしてやることで任意の型に変換されたデータを得られます。
なでしこのプログラムから与えられた引数を取得するには以下のようにします。
PHiValue __stdcall Test(DWORD HandleArg){
PHiValue arg0, arg1;
std::string str;
// 引数の取得処理
arg0 = nako_getFuncArg(HandleArg, 0); // インデックス[0]番の引数を得る
arg1 = nako_getFuncArg(HandleArg, 1); // インデックス[1]番の引数を得る
...
『nako_getFuncArg(HandleArg, Index)』と呼ぶことで、なでしこの引数を定義した順番に得ることができます。
次に戻り値に関してですが、なでしこの関数は必ず、PHiValue型の戻り値を返すか、return NULL とヌルを返します。
値を返す場合ですが、PHiValue型はポインタ型なので、new(ポインタ型)で作ることもできるのですが、値をうまく初期化してくれないので、以下のように、hi_va_new という特殊な関数を使って生成します。
PHiValue Result; // Resultを宣言(Delphiの名残)
Result = hi_new_var; // 値の生成
hi_setInt(Result, 50); // 50をセット
hi_setStr(Result, "abc"); // 'abc'をセット
PHiValue型を生成したら、hi_setInt(Result, 30) のように値を設定したら戻り値の設定が完了です。
// 整数をセットする
void hi_setInt (PHiValue v,int num);
// 実数をセットする
void hi_setFloat(PHiValue v,HFloat num);
// BOOL型をセットする
void hi_setBool(PHiValue v,BOOL b);
// 文字列をセットする
void hi_setStr(PHiValue v,string s);
配列やハッシュ、グループをセットする場合は、dnakoがエクスポートしている関数を使ってセットします。
さて、せっかく関数を作ってもシステムに登録しなくては意味がありません。
システムへの登録は、あらかじめ、雛形に用意されているImportNakoFunction の中で行います。以下は、登録例です。
extern "C" __declspec(dllexport) void __stdcall WINAPI ImportNakoFunction(void)
{
// なでしこシステムに関数を追加
AddFunc("テスト", "Sの", 0, TestFunc, "ただ引数を返すだけの簡単な関数", "てすと");
AddFunc("テスト発言", "Sと|Sで|SのSを", 0, TestSay, "ただ引数を表示する簡単な関数", "てすとはつげん");
// なでしこシステムに文字列を追加
AddStrVar("テスト文字列", "適当な値", 0, "定義する文字列","てすともじれつ");
// なでしこシステムに整数を追加
AddIntVar("テスト整数", 3, 0, "定義する整数","てすとせいすう");
}
AddFunc 関数は以下の書式で指定します。
AddFunc( なでしこ関数名, 引数, IDタグ, C++関数名, "説明", "よみ")
これを正しく作っておくとなでしこのマニュアル自動生成スクリプトを使って、command.txtの形式に自動変換することが可能です。
コンパイル前にプロジェクトの設定で、コンパイル後の名前を設定しておきましょう。
コンパイルすると、DLLが生成されますので、これをなでしこのplug-insフォルダに放り込んで完成です。
このファイルの説明文は、殆どクジラ飛行机さんが作られた「プラグインについて.txt」の引用です。
BCC Borland C Compilerはボーランド(株)の著作物です。BCC Developerは三浦淳氏の著作物です。
2005/12/31 hi_strにあったバグ(0サイズ文字列時にエラー)を修正
2005/07/03 公開