本文へスキップ

拡張モジュール作成DLL MAKE

拡張モジュールについて

SocketDebuggerでは、ユーザが自由な通信仕様に従ってテストを行うことが可能です。
デフォルトの設定だけでは実現不可能なビジネスロジックを、DLLで提供することにより可能となります。

例えば、ある通信伝文を受信した際に、その内容に応じた応答伝文を返したり、他のサブシステムのもつデータを参照して、その結果を応答したりすることができます。

この機能は無料版であるSocketDebuggerFree、SerialDebuggerFreeでも利用できます。


拡張モジュール作成手順概要

DLL内部で、1本のコールバック用関数を用意します。
そのコールバック関数がSocketDebugger本体から状況によりコールされるため、データの受け渡しや、状況に応じた挙動を指定します。

また、DLL内で設定ウィンドウを表示し、その設定内容を本体に渡すことにより他の通信設定と同様に保存が可能となりプロジェクトに応じた設定可能な拡張処理の作成を行うことができます。


拡張モジュール作成手順

拡張モジュールの作成方法について記述します。
※ここでは製作環境としてVisual C++6.0を用いてご説明いたします。

1.プロジェクトを作成する

Visual C++を起動し、「ファイル」→「新規作成」でプロジェクトタブを選択します。

MFC AppWizard (dll)を選択し、DLLの名前を入力します。
(ここではSampleSDGとしますが、自由に宣言ください。)

2.ウィザード設定 ステップ 1/1

DLLの設定で MFCのスタティックライブラリを指定します。

3.定義ファイルのインクルードとコールバック関数の記述

以下のヘッダーファイルをダウンロードして下さい。
※ヘッダーファイル内にも使い方の説明がありますのでそちらも参照下さい。
ヘッダーファイル:SDGDLLEX.H

SampleSDG.cppを開いて、SDGDLLEX.Hをインクルードします。

// SampleSDG.cpp : DLL 用の初期化処理の定義を行います。
//
#include "stdafx.h"
#include "SDGDLLEX.H"
#include "SampleSDG.h"

コールバック関数の雛形をSampleSDG.cppの最後に追加します。

//////////////////////////////////////////////////
// 唯一の CSampleSDGApp オブジェクト
CSampleSDGApp theApp;

//------------------------------------------------
//	SDGコールバック関数
//------------------------------------------------
DWORD WINAPI CallBackSDG( ULONG dest, ULONG src ){
	return SDGDLL_RESULTOK;
}

SampleSDG.defファイルにコールバック関数を定義します。

; SampleSDG.def : DLL 用のモジュール パラメータ宣言
LIBRARY      "SampleSDG"
DESCRIPTION  'SampleSDG Windows Dynamic Link Library'
EXPORTS
    ; 明示的なエクスポートはここへ記述できます
    CallBackSDG

以上でプログラムの雛形が完成です。
まずはここまででコンパイルが通ることを確認してください。

4.関数作成

今回サンプルで作成する関数の仕様は以下とします。

1.設備サーバと複数のPC間で8バイト固定サイズでデータ伝送を行う。
2.データ伝送が起きるパターンはPCから、クライアントでコネクションを行い
  設備サーバに設備の動作指示の通信を行う。
   @ 機械Aを稼動--> "A0000000" (Ascii)
   @ 機械Aを停止--> "A0000001" (Ascii)
  この要求に対し、設備サーバでは要求に対する処理を行ったのち、
   @ 正常終了--> "OK"  (Ascii)
   @ 異常終了--> "ERR" (Ascii)
  を返送する。ただし、PCからの通信内容が誤りの場合も
  異常終了コードを返送する。
3.この設備サーバの動作をシミュレートする。

上記仕様に従ってプログラミングを行います。

/////////////////////////////////////////////////////////////////////////////
// 唯一の CSampleSDGApp オブジェクト
CSampleSDGApp theApp;

#define  SDGDLL_VER (0x100)               // DLLバージョンの宣言
MC_SDGMODULE;                             // 一般的なサブルーチンの宣言
//-------------------------------------------------------------------
//	DLL説明文の宣言
//-------------------------------------------------------------------
MC_SDGHEAD(
_T("通信応答テストプログラム"),
_T("データを受信したら要求コードをチェックして\r\n")
_T("OK、ERRを返送します。\r\n")
);
//------------------------------------------------
//  SDGコールバック関数
//------------------------------------------------
DWORD WINAPI CallBackSDG( ULONG dest, ULONG src ){
    MC_MODULEUSE;                           // 変数宣言
    //----------------------------------------------
    //  定型マクロ処理
    //----------------------------------------------
    MC_EV_DEFAULT;                          // 基本パラメータセット
    MC_EV_GETCOMMENT;                       // DLLのコメント情報を取得する
    MC_EV_GETVER;                           // ver.を取得する
    MC_EV_CONFIGRESULT(SDGDLL_CONFIGNOT);   // コンフィグの有無を取得する
    //----------------------------------------------
    //  データ受信
    //----------------------------------------------
    if( srcData->command & SDGDLL_ONRECEIVE ){
        BOOL    bResult = FALSE;            // はじめはエラー返送をセット
        if( srcData->buffsize == 8 ){       // 受信データは規定のサイズ?
            if( memcmp( srcData->lpbuffer, _T("A0000000"), 8 ) == 0 ||
                memcmp( srcData->lpbuffer, _T("A0000001"), 8 ) == 0 ){
                bResult = TRUE;             // OKの返送を行う
            }
        }
        destData->command = SDGDLL_REQSEND;     // データ送信要求を行う
        destData->wparam = 0;                   // 受信したポートのみ返送する
        destData->lpbuffer = srcData->lpbuffer; // 受信データエリアを
                                                // 送信データエリアに流用
        // ここで、受信データエリアは通信の設定で決めた
        //「内部プログラム受信バッファサイズ」が適用されていますので、
        // そのサイズまでは上書きが可能になります。
        // サイズがそれを超過する可能性がある通信仕様では、
        // 内部で確保する必要があります。
        // 確保した場合は開放のタイミングを作成することをお忘れなく
        if( bResult ){
            destData->buffsize = 2;             // 送信データは2Byte
            lstrcpy( (char*)destData->lpbuffer, _T("OK") );
        }
        else{
            destData->buffsize = 3;             // 送信データは3Byte
            lstrcpy( (char*)destData->lpbuffer, _T("ERR") );
        }
        return SDGDLL_RESULTOK;
    }
    return SDGDLL_RESULTOK;
}

本プログラムをコピーしてビルドしてください。
生成されたDLLをSocketDebuggerと同じフォルダに格納し、設定ダイアログから拡張DLLを選択すれば、実行可能です。
なお、動作設定で拡張動作を選択する必要があります。

5.定義済みマクロ・定数説明

[4.関数作成]までの説明で拡張モジュールを作成する事は可能ですが、上記プログラムで使用されている定義済みマクロや定数について説明します。マクロや定数は[3.定義ファイルのインクルードとコールバック関数の記述]でインクルードしたSDGDLLEX.H内に定義されています。

まずは以下の2行です。
SDGDLL_VERという名称でバージョン情報を定義し、コールバック関数の中でMC_EV_GETVERを記述することで、SocketDebuggerからDLLのバージョン要求があった場合に自動的に定義したバージョン情報を返すことが可能です。

#define  SDGDLL_VER (0x100)               // DLLバージョンの宣言
(中略)
    MC_EV_GETVER;                           // ver.を取得する

次に以下の記述ですが、これは上記のバージョン定義と同様でDLLの説明を自動的にSocketDebuggerに返す事が可能です。
なおMC_SDGHEAD()内のテキストは自由に変更することが可能です。

MC_SDGHEAD(
_T("通信応答テストプログラム"),
_T("データを受信したら要求コードをチェックして\r\n")
_T("OK、ERRを返送します。\r\n")
);
(中略)
    MC_EV_GETCOMMENT;                       // DLLのコメント情報を取得する

次にコールバック関数内の最初に記述されているMC_MODULEUSEですが、取得した引数を実際の処理で使用されるSDGDLLSTRUCT型に変換しています。これは以下の2行と同じ意味になります。
以降の処理で登場するdestDataとsrcDataという変数はここで宣言された物になります。

SDGDLLSTRUCT*	destData	= (SDGDLLSTRUCT*)dest;
SDGDLLSTRUCT*	srcData		= (SDGDLLSTRUCT*)src;

なお、実際のパラメータ代入はMC_EV_DEFAULTというマクロで行われます。

データ受信と書かれた以下の行ですが、これはSocketDebuggerからどのような要求(イベント)でコールバック関数が呼び出されたのかを判断しています。

    if( srcData->command & SDGDLL_ONRECEIVE ){

SDGDLL_ONRECEIVEというのはデータ受信要求(イベント)を表しており、同様にSDGDLL_ONCONNECTなら通信接続完了、SDGDLL_ONCLOSEであれば通信切断となります。それ以外の要求はSDGDLLEX.Hの中をご確認下さい。
少し前に説明しましたMC_EV_GETCOMMENTやMC_EV_GETVERの中では同様の方法でSocketDebuggerからの要求を判別しています。

最後に以下の4行ですが、これはSocketDebuggerに対して通信相手にデータを送信するように要求しています。SDGDLL_REQSENDが送信要求のコマンドになり、それ以外は送信相手と送信データを指定しています。
送信相手の指定方法等もSDGDLLEX.Hに記載しております。

        destData->command = SDGDLL_REQSEND;     // データ送信要求を行う
        destData->wparam = 0;                   // 受信したポートのみ返送する
        destData->lpbuffer = srcData->lpbuffer; // 受信データエリアを
                                                // 送信データエリアに流用

マクロのパラメータや戻り値についてはSDGDLLEX.H内で説明しておりますのでそちらをご確認下さい。


ここで作成したサンプルは、ダウンロードページに格納しています。
最も簡単な応答プログラムとして活用いただけるのではないかと思います。
[ ダウンロード ] - [ 拡張ライブラリ ]

作成した拡張DLLについて、よろしければ本サイトで公開いたしますのでその場合はご連絡ください。


バナースペース