課題山積ではあるのですが、インターフェースレベルでは動かせるようになったのでとりあえず公開。
しかし取り説付けないと、わけわかんないですよねぇ‥‥。なんかテキストエディタ相手に書く気が出てこなかったので、とりあえずblogに。
- 追記:shiori requestが大きすぎるときにログ出力で落ちるバグを修正。
- 5/29 追記:バージョン1.2.0.0にあわせて記述を一部差し替え。
SHIOLINKとは?
匿名PIPE通信を利用した子プロセスとの通信プロキシSHIORIです。起動時に指定されたexeファイルを別プロセスで起動し、本体から送られるSHIORI REQUESTを起動したexeの標準入出力へのやり取りに変換し、その結果を本体に返します。
特徴は?どんな人向け?
- この栞は、この環境をベースに更に怪しげなことをするためのプラットフォームです。既存のSHIORIの拡張が出来るというより、1から作りたい人向きです。
- 別プロセスで起動しますので、特にマネージで開発したいときや、行儀の悪いスクリプト言語(グローバル変数とか使ってたり!)でもそれなりに動くかもしれない!
- 起動できるのは、cmd.exeで起動できるコマンドと考えていれば大体問題ないと思います。つまり、実用性があるかどうかはともかく、batファイルとかvbsファイルとかjsファイルとか起動できます、多分(^^;
配布ファイル
こちらの最新ファイルをダウンロードしてください。なお、動作には.WSHが必要です。おそらくIEが入っていればインストールされていますが、動作確認はWSH 5.6以上ですのでご注意ください。
ディレクトリ構成
[GHOST-DIR]
├─[ghost]
│ [master]
│ ├─descript.txt :SHIORI設定記述ファイル
│ ├─SHIOLINK.dll :プロキシSHIORI DLL
│ ├─SHIOLINK.ini :プロキシSHIORIのINIファイル(DLL名の拡張子を.iniにしたもの)
│ └─LINKJS.js :プロキシ栞が呼び出すJScript(サンプル。要 WSH 5.6)
└─[shell]
...
設定ファイルの記述
SHIOLINK.ini
[SHIOLINK]
; コマンドライン:
commandline = cscript /Nologo LINKJS.js
; 文字モード: ANSI(Shift_JIS) / UTF-8 の何れか
charmode = ANSI
[LOGGING]
; ログファイル名:
file = SHIOLINK.log
; ログレベル: debug / info / warn / error / fatal / none
level = debug
起動されるexeの環境
SHIOLINK.dllは指定されたexeなどを起動しますが、起動に先立ち次の設定を行います。
- カレントディレクトリを[/ghost/master]ディレクトリに設定します。
- exeのSTDIN/STDOUTに、SHIOLINK.dll内の匿名パイプをつなぎます。
つまり、exe側は、[/ghost/master]ディレクトリで起動されたと仮定し、標準入出力を相手にコマンド処理を随時行えばいいことになります。実装試験などの場合は標準入力に対し適当にテキストを投入してやることで、試験を行うことができます。
# cscript /Nologo LINKJS.js < test_req.txt > test_res.txt
これで、test_res.txtに結果が返る
通信プロトコル
本システムの文字エンコードはUTF-8/ANSI(SHIFT-JIS)の選択です。
SHIORI REQUESTに、同期処理用のコマンドを若干追加しています。
例
栞プロキシのrequest
exe側のresponse
1
*L:C:\[省略]\ghost\SHIOLINK\ghost\master
[応答なし]
2
*S:F6BA264E-AEA9-4886-B291-01C4664C504D
3
*S:F6BA264E-AEA9-4886-B291-01C4664C504D
4
GET SHIORI/3.0
Sender: SSP
Charset: UTF-8
SecurityLevel: local
ID: OnBoot
Reference0: しおLINK!(フリーシェル:自由なみかず)
[空行]
5
SHIORI/3.0 200 OK
Charset: UTF-8
Sender: LINKSHIO
Value: \u\s[10]\h\s[0]さて、[〜省略〜]\-
[空行]
6
*U:
[応答なし、終了]
流れ
すべてのやり取りは改行で区切られます。*で始まる行が同期コマンドです。*で始まる、exe側が知らないコマンドが流れてきた場合はすべて読み捨ててください。
- [*L:]コマンドは[SHIORI::load]命令に相当します。起動時に[*L:(loaddir)]と送られます。このコマンドに対する応答はありません。
- [*S:]コマンドは[SHIORI::request]命令の同期のために発行されます。[*S:(GUID)]となっています。
- exe側は、来た[*S:]コマンドの内容をそのままオウム返ししてください。SHIOLINK.DLLはこの応答を待って[SHIORI::request]本体を送信します。
- [SHIORI::request]本体です。空行までがリクエストです。exe側は空行が来るまでテキストを読み込んでください。
- [SHIORI::request]に対するレスポンスです。空行までがレスポンス扱いとなります。
- [*U:]コマンドは[SHIORI::unload]命令に相当します。exe側は終了処理を行い、直ちに終了してください。このコマンドに対する応答はありません。
ToDo
- リクエストタイムアウト機能
- ソースコードに変な依存が無いように
- →対応
- 怪しいサンプルを何個かつける
- →JScriptであやしくしてみた
- もともとの目的の、CLIPS栞に再着手すること!
- SAORIとして呼べたら、SAORI BASIC ADVANCEとかになるかもしれない(?)