winsend

プロセス間通信に第3の選択肢としてwinsendが登場しました。
といってもDDEと同じくWindowsプラットフォームだけのサポートです。
winsendはマイクロソフトのCOMテクノロジーを使用します。
COMはインターフェースを通じてプロセス間通信を行うことを目指しています。

Tclで使える3つのプロセス間通信の特徴をまとめました。

プロセス間通信メリット・デメリット
winsend
(COM)
  • ○ インタプリタの自動登録が可能である。
  • ○ WordやExcel等のアプリケーションと通信できる。
  • × Windowsプラットフォームのみである。
ソケット
  • ○ マルチプラットフォーム対応である。
  • × ポート数に限りがある。
  • × クライアントにポート番号を教える必要がある。
DDE
  • ○ インタプリタの自動登録が可能である。
  • ○ WordやExcel等のアプリケーションと通信できる。
  • × Windowsプラットフォームのみである。
  • × お行儀の悪いアプリケーションがいるとハングする。

winsendはTcl8.3以上の環境で動作します。

サンプル

次のサンプルは、サーバ名を明確に定義する例です。

# サーバー
package require winsend

winsend appname foo
vwait var
puts $var
=> 123
# クライアント
package require winsend

winsend send foo set var 123

次のサンプルは、サーバ名を明確に定義しない例です。
この例は自動登録されたインタプリタ名を使っています。

# サーバー (tkcon.tclから実行)
package require winsend

vwait var
puts $var
=> 123
# クライアント (wish83.exeから実行)
package require winsend

winsend send tkcon.tcl set var 123

通信できるインタプリタを知るには、winsend interpsコマンドで一覧を取得できます。

他のアプリケーションとの通信

Tclインタプリタ同士以外に他のアプリケーションとの通信も可能です。
次のVBスクリプトは、Windowsスクリプティング・ホスト・アプリケーション
cscript test.vbsを使用してTclインタプリタと通信することができます。

Set interp = GetObject("\\.\TclInterp\tkcon.tcl")
interp.Send "puts {Hello from VB Script}"
WScript.Echo interp.Send("info tcl")

まとめ

winsendは、COMの知識を全く必要とせずに使えます。国際化にも対応しているので安心して使えそうです。
ただし、Windowsプラットフォームのみなので、現在、DDEに不満のある人向けという感じですね。


winsend