Socket Debugger


拡張モジュールの作り方
拡張組み込みDLLについて

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

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

 SocketDebuggerFree,SerialDebuggerも利用できます。
組み込みDLLの概要

 DLL内部で、1本のコールバック用関数を用意します。
 SocketDebugger本体から状況によりコールされ、
 データの受け渡しや、状況に応じた挙動を指定できます。
 また、DLL内で設定ウィンドウを表示し、その設定内容を本体に
 渡すことにより他の通信設定と同様に保存が可能となり、
 プロジェクトに応じた設定可能な拡張処理の作成を行うことが
 できます。
組み込みDLLの作成方法

 SocketDebuggerに組み込み可能なDLLの作成方法について記述します。
 ※環境についてはVisual C++ 6.0で紹介します。

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

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


Aウィザード設定 ステップ 1/1
 DLLの設定で MFCのスタティックライブラリを指定します。


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

 SDGDLLEX.Hをダウンロードします。
 ※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
 以上でプログラム環境的な設定は終了です。  まずはここまででコンパイルが通るか確認してください。   C次にここでの内部処理の仮仕様を決めます。
 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;
}
本プログラムをコピーしてビルドしてください。 SocketDebuggerと同じフォルダに格納して、設定ダイアログから 拡張DLLを選択すれば、実行可能です。 動作設定で拡張動作を選択する必要があります。 ここで作成したサンプルは、ダウンロードページに格納します。 最も簡単な応答プログラムとして活用いただけるのではないかと思います。 ダウンロードページには他にも有用なサンプルがソース付きで公開されていますので サンプルとヘッダを参照して、対象システムにあった拡張DLLを作成してください。 作成した拡張DLLについて、 よろしければ本サイトで公開いたしますので その場合はご連絡ください。  
機能紹介
動作環境
シェアウェア版とフリー版
使い方
使い方
拡張モジュールの作り方
Luaスクリプト
Q&A
ダウンロード
購入方法
改訂履歴
著作権
作者から

Vector