Socket Debugger

Luaスクリプト用拡張DLLの作り方
Luaスクリプト拡張DLLについて

 SocketDebuggerでは、ユーザがLuaスクリプトにより通信処理を
 自由にカスタマイズすることが可能です。

 ですが、スクリプトでは記述できない処理、または
 ユーザのサブシステムと連動する必要がある処理などは
 標準のままでは表現できません。

 SocketDebuggerでは、Luaスクリプト内部から呼び出しが行える関数を
 DLL形式で作成することで追加が可能となります。
 
 SocketDebuggerは起動時、同一フォルダにあるDLLを検索し、
 Lua拡張関数が存在するかを確認します。
 対応DLLがあった場合、利用が可能であることをバージョン情報ダイアログに表示します。
 また、追加された関数はスクリプトエディタ中で紫色で表示されます。

ダイアログの下部に、DLL名称と追加された関数名が表示される。


スクリプトエディタでは、追加された命令は紫色で表示される。


 以下に、対応DLLの作成方法を説明します。
 (SocketDebuggerFree,SerialDebuggerも利用可能です。)
Lua拡張の概要


Luaの拡張DLLを作成するためには、Luaのライブラリが必要となります。
ここでは、SocketDebugger本体と同じバージョンを利用して説明します。

バージョン          Lua 5.1.2
種類                Windows x86 Static Library and Includes
                    (Visual C++ 6 Compatible)
ファイル名称        lua5_1_2_Win32_vc6_lib.zip
ダウンロードURL     http://luabinaries.luaforge.net/download.html

Luaによる処理を記述するには、C言語、Lua言語の多少の知識が必要となります。
ですが、公開しているサンプルを活用することで、C言語の知識のある人であれば
Luaの記述方法は理解できるものと思います。

サンプルソースの中には、SocketDebuggerから認識するための関数と
Luaの定型的な処理の関数、および参考として欲しい拡張関数の記述があります。

スクリプトから呼び出すLua関数のC言語表現は常にパラメータはひとつとなります。
その、唯一のLua識別子から、引数などの判断を行います。

利用可能な関数や、記述方法についての詳細はリファレンスを参照ください。
Google Lua 5.1 リファレンス 検索

Lua拡張DLLの作成方法

 SocketDebuggerのLuaスクリプト制御に追加可能なDLLの作成方法について記述します。
 ※環境についてはVisual C++ 6.0で紹介します。

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

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


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


B以下のようなフォルダ構成となります。

(↓フォルダ内)


Cダウンロードしたluaライブラリを以下のように展開します。


D下記SampleEx.cppをダウンロードしてプロジェクトに加えます。
  Luaライブラリのリンケージについては、ソース中に記述してあるため
  プロジェクトの設定を特に変更する必要はありません。
 SampleEx.cpp

(↓VCプロジェクトに加える。)


ESampleLuaEx.defファイルを下記のように編集します。
  赤字が追記した部分です。
  先頭のGetModuleNameはSocketDebuggerとのリンケージ用に必須です。
  以下の2つはユーザが実際に追加する関数名となります。
 (サンプルでは2つの関数を追加しています。)
 ; SampleLuaEx.def : DLL 用のモジュール パラメータ宣言
 LIBRARY      "SampleLuaEx"
 DESCRIPTION  'SampleLuaEx Windows Dynamic Link Library'
 EXPORTS
     ; 明示的なエクスポートはここへ記述できます
     GetModuleName
     FileReadEx
     FileWriteEx
F以上でLua用拡張DLLのサンプル作成は完了です。 ビルドを行えば、SampleLuaEx.dllが生成されます。 サンプルを活用して、必要な処理の追加を行ってください。
動作サンプル

上記で作成したサンプルDLLを下記からダウンロードが可能です。
SocketDebugger.exeと同一のフォルダにコピーし、起動してください。

SampleLuaEx.dll(SampleLuaEx.zip)

上記の追加により利用可能な2つの関数について、下記に説明します。
関数: 拡張ファイル読み込み
<<概要>>
ファイル読み込みの拡張処理

result = FileReadEx( sFileName )
result = FileReadEx( sFileName, iStartPosition )
result = FileReadEx( sFileName, iStartPosition, iSize )

<<引数>>
sFileName(文字列)     読み込むファイル名称
iStartPosition(数値)  読み込み開始バイト位置(省略可)
                      省略時、負値は先頭から読み込み
iSize(数値)           読み込みバイト数(省略可)
                      省略時、負値、0の場合は全て読み込み

<<戻り値>>
テーブル              読み込んだデータ
数値                  異常終了
                      1:パラメータエラー
                      2:ファイル名称文字列認識エラー
                      3:読込開始バイト位置の型チェックエラー
                      4:読込サイズの型チェックの型チェックエラー
                      5:ファイル情報取得エラー
                      6:ファイルサイズ無し
                      7:読み込み開始位置はEOF超過
                      8:指定された読み込みバイト数に満たなかった
                      9:ファイル読み込みエリア確保エラー
                      10:ファイルオープンエラー
                      11:ファイル読み込みエラー
                      12:ファイル読み込みその他のエラー

<<例>>
(1)
result = FileReadEx( "c:\\test.txt" )
└指定されたファイルを全て読み込む

(2)
result = FileReadEx( "c:\\test.txt", 16 )
└指定されたファイルの16バイト目から以降全て読み込む

(3)
result = FileReadEx( "c:\\test.txt", 16, 32 )
└指定されたファイルの16バイト目から32バイト分読み込む
関数: 拡張ファイル書き込み
<<概要>>
ファイル書き込みの拡張処理

result = FileWriteEx( data, sFileName, iFlg )
result = FileWriteEx( data, sFileName )

<<引数>>
data(テーブル)        書き込むバイナリデータ
data(文字列)          書き込む文字列
                      (書き込むデータはテーブル、文字列どちらでも可)
sFileName(文字列)     読み込むファイル名称
iFlg(数値)            書き込み処理フラグ(省略可)
                      0:既存ファイルがあれば、
                        削除し新たにファイルを作成する。
                      1:既存ファイルがあればデータを追記する。
                      省略時、または上記範囲外の数値の場合は
                      0が適用されます。

<<戻り値>>
数値                  0:正常終了
                      1:パラメータエラー
                      2:ファイル名称文字列認識エラー
                      3:書き込み指定認識エラー
                      4:データ型認識エラー
                      5:ファイルオープンエラー
                      6:ファイル書き込みエラー

<<例>>
(1)
result = FileWriteEx( tbl, "c:\\test.txt" )
└テーブルtblの内容を"c:\test.txt"に書き込む。
  既にファイルが存在すれば上書きする。

(2)
result = FileWriteEx( "ABCDEFG", "c:\\test.txt", 1 )
└文字列"ABCDEFG"を"c:\test.txt"に書き込む。
  既にファイルが存在すれば追記する。
機能紹介
動作環境
シェアウェア版とフリー版
使い方
使い方
拡張モジュールの作り方
Luaスクリプト
Q&A
ダウンロード
購入方法
改訂履歴
著作権
作者から

Vector