Tcl インタープリターを C# GUI アプリケーションに埋め込もうとしていますが、NewFunction を TclCommand にアタッチしても、すべて正常に動作します。しかし、私にとって難しいことの1つは、stdout、stdin、stderrをいくつかのTextBoxにリダイレクトしたいということです。デバッグとコンパイルが簡単なため、現在C++で作業しています。だから私はコードを使用しています
Tcl_Channel StdOut = Tcl_GetStdChannel(TCL_STDOUT);
Tcl_UnregisterChannel(interp,StdOut);
Tcl_Channel myStdOut = Tcl_CreateChannel(typePtr, "stdout",
NULL, TCL_READABLE | TCL_WRITABLE);
Tcl_RegisterChannel(interp, myStdOut);
Tcl_SetStdChannel(myStdOut, TCL_STDOUT);
新しい stdout を登録するには、typePtr は次のようになります
typePtr->typeName = "stdout";
typePtr->version = TCL_CHANNEL_VERSION_2;
typePtr->getHandleProc = Tcl_MyDriverGetHandleProc;
typePtr->inputProc = Tcl_MyDriverInputProc;
typePtr->outputProc = Tcl_MyDriverOutputProc;
typePtr->flushProc = Tcl_MyDriverFlushProc;
typePtr->watchProc = Tcl_MyDriverWatchProc;
typePtr->closeProc = Tcl_MyDriverCloseProc;
typePtr->blockModeProc = Tcl_MyDriverBlockModeProc;
typePtr->seekProc = NULL;
typePtr->close2Proc = NULL;
typePtr->handlerProc = NULL;
typePtr->wideSeekProc = NULL;
typePtr->truncateProc = NULL;
typePtr->setOptionProc = NULL;
typePtr->getOptionProc = NULL;
typePtr->threadActionProc = NULL;
そして、私が接続するすべての関数はTCL_OKまたはEINVALを返し(私はAPIからそれを知っています)、いくつかのテキストをファイルに入れます、例
int Tcl_MyDriverCloseProc(ClientData instanceData,
Tcl_Interp *interp) {
std::cout << "\n Tcl_MyDriverCloseProc\n";
file << "\n Tcl_MyDriverCloseProc\n";
file.flush();
return EINVAL;
}
std::cout もデバッグに使用していますが、彼を信じていません。コンパイルして実行すると何も起こらず、標準出力が機能しません。結果はたとえば
result:stderr file8adcd0 stdout stdin:
result::
私がコンパイルしたコードは
Tcl_GetChannelNames(interp);
std::cout << "result:" << Tcl_GetStringResult(interp) << ":\n";
Tcl_Eval(interp, "puts SomeOneHelp");
std::cout << "result:" << Tcl_GetStringResult(interp) << ":\n";
カスタムチャネルも作成できず、次のように使用しました
"puts myChannel pleHdeeNI"
C++ を使い終わったら、C# で関数を作成します。これは、3 つの TCL 標準チャネルを TextBox に書き込みますが、簡単です。