我正在努力解決一個問題,並會感謝您的幫助。如何從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解釋器中運行這些程序&命令,請告訴我。
我正在努力解決一個問題,並會感謝您的幫助。如何從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解釋器中運行這些程序&命令,請告訴我。
在這個問題上花費了大量的時間後,我意識到從C發送tcl命令到現有的tcl/tk應用程序或解釋器沒有簡單的方法。
在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()
,這將把句柄返回給一個新創建的解釋器。這通常很明顯,你在做什麼。
我知道這兩個選項。在C中,它需要Tcl_CreateInterp()和tcl中的'load'。但是我的問題稍有不同,你已經有了一個具有特定應用程序名稱的tcl解釋器(在我的例子中,'x.y.123.3454')。現在我該如何調用並向這個特定的解釋器發送指令(tcl命令)? –
我很希望你能使它工作。我非常需要你的建議。 –
如果您的TCL和C過程可以考慮和處理作爲獨立的過程,任何標準IPC機制可以被用來傳遞兩者之間的信息。 'C'過程中的內容是一個文本,可以從TCL過程中'接受評估'以執行tcl命令。 – Sharad
你能否詳細說明一下?無論你提到的是什麼都是需要的,但是,如何做 - 這是一個問題。 –