0

tcl birary dll を拡張して、expect の機能を持たせることは可能ですか?

Tcl ライブラリ tcl85.dll を使用して TCL スクリプトを実行する C プログラムがあります。それは完全にうまく機能します。

最近、expect sript をいくつか実行しようとしましたが、失敗しました。tcl85.dll には、expect コマンドを独自に理解する機能がなく、拡張する必要があることを理解しています。これが私が立ち往生しているポイントです。アクティブサイトからexpectライブラリexpect543.dllをダウンロードしましたが、tcl85.dllでそれを拡張する方法がわかりません?

どんな助けや指導も本当に感謝しています。

ありがとうスニル

4

2 に答える 2

2

Tcl と Expect を DLL だけで考えるのはやめてください。Tcl DLL と Expect DLL は両方とも、それぞれのソフトウェアのコア機能を実装していますが、完全に自己完結型ではありません。

  • Tcl インタープリターは、ファイル システムから (動的に) ロードされる一連のライブラリ ファイルに依存します。これらのファイルには、エンコーディング ファイル、タイムゾーン情報ファイル、およびいわゆる「コア パッケージ」が含まれます (ただし、これらに限定されません) http
  • 通常のTcl パッケージである Expect パッケージは、pkgIndex.tclパッケージのコア機能を含む DLL を適切にロードして初期化する方法を「認識」し、実際にパッケージをTcl のパッケージ ローダー。

したがって、これらすべてを機能させるには、大まかに次のチェックリストに従う必要があります。

  1. コードに埋め込む Tcl インタープリターが適切に初期化されていることを確認し、外部パッケージをロードできるようにします。

  2. 完全なExpect パッケージを、組み込みインタープリターが外部パッケージを見つけると予想する場所の 1 つに配置します。

    パッケージ化機構がどのように機能し、特別なグローバル変数がどのように初期化されるかを理解するために、必ずthisthis、およびthisをお読みください。auto_path

  3. package require Expectプログラム内で、Expect パッケージの存在を必要とするスクリプトを呼び出して、それをロードします。

または、組み込みインタープリターで Tcl C API への適切な呼び出しを実行して、Expect パッケージの DLL を直接ロードし、後で実行するスクリプトですぐに使用できるようにすることもできます。

さらに別の方法 (スターターとして正しく理解するのは難しい) は、いわゆる「ベースキット」または「tclkit」を使用することです。これは、仮想ファイル システムを使用して特定の Tcl パッケージが含まれている Tcl ライブラリです。実行時にその VFS からロードできます。これらの*キットはクールですが、適切なキットの作成を習得することは、「通常の」インタープリターとメインプログラムと共にファイルのセットとして配布される通常のパッケージを埋め込むよりも困難です。


1 つの特記事項: ActiveTcl™ 製品のライセンスで、そのさまざまな部分を切り取って製品で使用することが許可されているかどうかはわかりません。IANALですが、そのライセンス条項に違反している可能性があります。安全のために、ソースから Tcl と Expect の両方をビルドします — それは難しいことではありません。

于 2013-07-30T12:52:57.417 に答える
0

基本的に、expect インタープリターを初期化する必要があります。これが完了すると、TCL_Eval(.) は期待されるコードも理解します。

Tcl_Interp *interp = Tcl_CreateInterp();
Tcl_FindExecutable(argv[0]);

if (Tcl_Init(interp) == TCL_ERROR) {
    fprintf(stderr,"Tcl_Init failed: %s\n",Tcl_GetStringResult (interp));
    (void) exit(1);
}
    //Initializing the expect interpreter here
if (Expect_Init(interp) == TCL_ERROR) {
    fprintf(stderr,"Expect_Init failed: %s\n",Tcl_GetStringResult (interp));
    (void) exit(1);
}
 //this can now take expect scripts as well in the buffer
 Tcl_Eval(interp, buffer);
于 2013-08-07T02:23:51.670 に答える