SHIOLINKの話
課題山積ではあるのですが、インターフェースレベルでは動かせるようになったのでとりあえず公開。
しかし取り説付けないと、わけわかんないですよねぇ‥‥。なんかテキストエディタ相手に書く気が出てこなかったので、とりあえずblogに。
- 追記:shiori requestが大きすぎるときにログ出力で落ちるバグを修正。
- 5/29 追記:バージョン1.2.0.0にあわせて記述を一部差し替え。
SHIOLINKとは?
匿名PIPE通信を利用した子プロセスとの通信プロキシSHIORIです。起動時に指定されたexeファイルを別プロセスで起動し、本体から送られるSHIORI REQUESTを起動したexeの標準入出力へのやり取りに変換し、その結果を本体に返します。
特徴は?どんな人向け?
配布ファイル
こちらの最新ファイルをダウンロードしてください。なお、動作には.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] ...
設定ファイルの記述
起動される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側は終了処理を行い、直ちに終了してください。このコマンドに対する応答はありません。