2013年9月15日日曜日

【なでしこ】プラグインを作ってみる ~実装編 管理用構造体を作る~

さて、設計したプラグインをいよいよ実装するわけですが、
今回はなでしこから見ると全部「ハンドル」として見えるので、
DLL側で全てのハンドルを管理できる構造体を作成します。

------ここから------

typedef struct
{
    int index;
    unsigned long flag;
    int size;
    CRITICAL_SECTION crit;
 
    union
    {
        unsigned long byte_hdl;
        unsigned char b[4];
        void *buf_hdl;
        void *list_hdl;
        FILE *fp_hdl;
        int sock_hdl;
        HANDLE ser_hdl;
    }u;
 
    void *pextend;
 
    void *pprev;
    void *pnext;

}COMM_HANDLE;

------ここまで------

このプラグインは主に通信用途と、一般的なC的関数の実装
を意識したのでCommunication, Commonを意識して"COMM_"
としました。

構造自体は簡単で、unionの中にハンドル本体を保存する
変数、もしくはポインタが配置されてます。1,2,4byteのバイト
配列はunsigned char, unsigned short, unsigned longに相当
するものとして、これは構造体の中で値を管理します。
その他のハンドルはポインタです。あ、socketはポインタ
じゃなかったな(^^;。

pextendは各ハンドルに対して付加的な情報が必要な場合に
使用します。pprevとpnextはキューとかスタックをリスト構造で
管理してるので、それらを管理する場合にこの構造体を
連結するためのものです。

実際、なでしこの各変数もこれに近い構造体で管理している
ので、こういう言語拡張系のDLLではまずまず一般的な
形なのではないかと思います。

2013年9月9日月曜日

【なでしこ】お、イベント発生成功!

どうもプログラムが間違っていたらしく、DLLでイベント発生成功!。思ってた
通り、

------ここから------

    if (arg1->VType == varGroup)
    {
        ret = pfnako->nako_group_findMember(arg1, "発生した時");
       
        if (ret->VType != varNil)
        {
            pfnako->nako_group_exec(arg1, "発生した時");
        }
        else
        {
            /*Do Nothing*/
            ;
        }
    }

------ここまで------

の様なコード書いておいて、なでしこ側で

------ここから------

 ■テストグループ
 ・{イベント}発生した時

G1とはテストグループ
G1→発生した時は~
 「イベント発生」と表示
 
DLL引数ダンプ(G1) /*ここでDLLの関数をコール。グループを渡す*/

------ここまで------

と、やってやると、テストグループのイベントをDLL側からコールできました(^^)。
これで今までなでしこ→DLLの一方方向なコールシーケンスしか出来なかった
けど、DLL→なでしこなコールシーケンスも書ける!。ただし、一旦なでしこ定義の
関数に処理が渡ってること考えると、スレッドセーフではない気はします。
セマフォとか同期処理を上手く入れてやればDLL側のスレッドでもコールできる
かも…。

2013年9月8日日曜日

【なでしこ】イベントで行き詰る( ̄ω ̄;

なでしこのグループを作った際

------ここから------

■Gテスト
 ・{イベント}テスト動作した時

------ここまで------

みたいな感じで、イベントをかけるんですが、これを関数の引数として
DLLに渡すと、案の定PHiValueで渡ってきます。まあ、ここまでは
配列であれ整数であれ一緒なので予想通りだったんですが…

この”イベント”についてnako_group_exec()と言う関数が定義してあって
どうもグループのイベントを検索して実行できるっぽいんだけど…出来ない
( ̄□ ̄;。これが出きると、なでしこ側で定義した「関数」っぽいものを
DLL側からコールできるので、DLL側でイベントを発生させてそれに合わ
せてなでしこの動きを制御できるはずだったんだけどなあ。

もうちょっと調べてみるか。