2017-01-23 69 views
0

我正在努力解決一個問題,並會感謝您的幫助。如何從C應用程序向tcl/tk解釋器發送tcl命令

我們假設我有一個tcl/tk應用程序和解釋器'x.y.123.3454',我想從C應用程序發送'x.y.123.3454'中定義的一些tcl過程。

例如,我想從C應用程序發送puts "Hello World"到'x.y.123.3454'。怎麼做?

如果您想知道,爲什麼我不直接在那個tcl解釋器中運行這些程序&命令,請告訴我。

+0

如果您的TCL和C過程可以考慮和處理作爲獨立的過程,任何標準IPC機制可以被用來傳遞兩者之間的信息。 'C'過程中的內容是一個文本,可以從TCL過程中'接受評估'以執行tcl命令。 – Sharad

+0

你能否詳細說明一下?無論你提到的是什麼都是需要的,但是,如何做 - 這是一個問題。 –

回答

0

在這個問題上花費了大量的時間後,我意識到從C發送tcl命令到現有的tcl/tk應用程序或解釋器沒有簡單的方法。

以下鏈接同意: http://cpptk.sourceforge.net/doc.html

1

在C級別上,Tcl解釋器由Tcl_Interp *類型的句柄表示(應將其視爲指向不透明結構)。傳統上,使用Tcl API的人使用interp這個名稱,但這並不重要。一旦你有這樣一個把手,可以使用:

int returnCode = Tcl_Eval(interp, "puts \"Hello World\""); 

運行一些代碼(反斜線在那裏,因爲我們把雙引號一個C字符串常量內)。如果執行成功,返回碼將等於TCL_OK,如果出現錯誤,則等於TCL_ERROR。在OK的情況下,你得到的結果值爲Tcl_GetObjResult(interp)(你可以使用Tcl_GetString來獲得打印結果的字符串版本)。在錯誤情況下,您使用相同的功能(即Tcl_GetObjResult,Tcl_GetString)來檢索錯誤消息。還有其他可能的返回碼,但您通常不會看到它們。

當然,puts的結果是成功的空串;信息被打印出來,沒有被返回。


你是如何得到這個解釋器句柄的?那麼,這取決於你的代碼如何與Tcl集成。如果你正在編寫一個Tcl的共享庫load,它是你初始化函數的唯一參數。另一方面,如果你嵌入Tcl,那麼你可能在某個時候調用Tcl_CreateInterp(),這將把句柄返回給一個新創建的解釋器。這通常很明顯,你在做什麼。

+0

我知道這兩個選項。在C中,它需要Tcl_CreateInterp()和tcl中的'load'。但是我的問題稍有不同,你已經有了一個具有特定應用程序名稱的tcl解釋器(在我的例子中,'x.y.123.3454')。現在我該如何調用並向這個特定的解釋器發送指令(tcl命令)? –

+0

我很希望你能使它工作。我非常需要你的建議。 –

相關問題