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ではまずまず一般的な
形なのではないかと思います。