求救!! Tcl 與 VTcl 的差異

探討「內嵌」以及「腳本化」這兩個主題的技術-版主XO老師(熟悉的目前是 Tcl,討論內容也會環繞在 Tcl 四周,但是本版還是歡迎其他 Scripting 語言以及任何「內嵌」技術的討論。)

版主: b80203, ghost3401, XO, maa

分享到: Facebook

求救!! Tcl 與 VTcl 的差異

文章Calvin176 » 週二 4月 07, 2015 4:20 pm

小弟正在開發 Tcl 使用的 dll, 目前發現在 Tclsh 的環境下都可以正常呼叫這支 dll,
但是在 VTcl 環境下呼叫這支 dll, 傳進變數後, 把變數的值打印出來,
確發現每次打印的值都不一樣,
想請教各位有什麼辦法可以參考:
Tclsh 正確的執行
tclsh.jpg
Tclsh 正確的執行
(40.53 KiB) 尚未被下載


VTcl 執行不正確的結果
VTcl.jpg
VTcl 執行不正確的結果
(64.96 KiB) 尚未被下載
Calvin176
剛學走路的小朋友
 
文章: 7
註冊時間: 週二 4月 07, 2015 4:06 pm

Re: 求救!! Tcl 與 VTcl 的差異

文章XO » 週三 4月 08, 2015 9:25 pm

感覺 VTcl 裡跑出來的好像不是數字結果,而是你 DLL 拋出的錯誤訊息 (我猜的),然後你的 encoding 沒設對,於是呈現出亂碼。

在 tclsh 與 VTcl 裡,分別下 encoding system 檢視一下你 encoding 的設定。
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5352
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re: 求救!! Tcl 與 VTcl 的差異

文章Calvin176 » 週一 4月 13, 2015 10:09 am

感謝大大們的幫忙!! 這個問題已經解了!! :)
不過又碰到另一個問題!! :cry:
在 vtcl.exe 下可以正常呼叫, 在自己寫的程式呼叫, 卻造成程式當掉!!
大大們有碰到過這個問題嗎??
Calvin176
剛學走路的小朋友
 
文章: 7
註冊時間: 週二 4月 07, 2015 4:06 pm

Re: 求救!! Tcl 與 VTcl 的差異

文章XO » 週一 4月 13, 2015 5:18 pm

上一個問題出在哪裡?
是編碼問題嗎?

原來看你 PO 的不是 Tcl 裡可以跑 (BTW, 你是用 ActiveTcl 嗎?),Visual Tcl 會亂碼!現在怎麼反而 vTcl 又可以跑了呢?
出現啥錯誤?可有啥錯誤資訊可資參考?
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5352
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re: 求救!! Tcl 與 VTcl 的差異

文章Calvin176 » 週二 4月 14, 2015 4:29 pm

上一個問題是變數宣告的問題, 原本我將變數宣告成 char point, 會變成亂碼, 後來把變數改宣告成 char[100], 就可以正常跑了, 那現在在 Visual Tcl 裡用 console 下指令的方式可以正常運作, 但寫成程式跑到那就會當掉, 大家有什麼好的建議.
Calvin176
剛學走路的小朋友
 
文章: 7
註冊時間: 週二 4月 07, 2015 4:06 pm

Re: 求救!! Tcl 與 VTcl 的差異

文章Calvin176 » 週四 4月 16, 2015 2:35 pm

老師您好, 我現在在寫與 server 溝通的程式, 與 server 溝通需要使用廠商所提供的 DLL, 但是不支援 Tcl,
所以我寫了一支 DLL, 讓我的程式可以透過我寫的 DLL, 去呼叫廠商寫的 DLL, 跟 server 溝通, 現在碰到一個問題,
我寫的程式在 tclsh 底下, 可以正常的跑完, 如下列:

D:\TCL\Project\20150408>tclsh test.tcl
Load dll OK!

Open connect MES OK!

Set Data Type OK!

Set Data Value OK!

OK;2015/04/15 18:11:02;
Get Date Time OK!

Close MES OK!


D:\TCL\Project\20150408>

在 vTcl 的 console 下, 手動下指令也可以正常跑完, 如下列:

loading history file ... 48 events added
buffer line limit: 512 max line length: unlimited
Main console display active (Tcl8.5.1 / Tk8.5.1)
(Test1) 49 % load TestTCL.dll
(Test1) 50 % SajetTrans Open
Connect to MES Srv Successfully.
(Test1) 51 % SajetTrans DataType 12
12
(Test1) 52 % SajetTrans DataValue 1
1
(Test1) 53 % SajetTrans SetData
OK;2015/04/16 14:19:05;
(Test1) 54 % SajetTrans Close
Disconnect to MES Srv Successfully.
(Test1) 55 %

Test.tcl 的原始檔:
set ret_value 99
load "TestTCL.dll"
after 3000
puts "Load dll OK! \n"
after 1000
SajetTrans Open
puts "Open connect MES OK! \n"
after 1000
SajetTrans DataType 12
puts "Set Data Type OK! \n"
after 1000
SajetTrans DataValue 1
puts "Set Data Value OK! \n"
after 1000
set ret_value [SajetTrans SetData]
after 1000
puts $ret_value
puts "Get Date Time OK! \n"
SajetTrans Close
puts "Close MES OK! \n"

可是我寫成程式, 讓它自動跑, 卻會當掉, 請問老師, 這有可能是什麼原因造成的?
附上測試畫面和 source code, 我試了好幾天, 都試不出來.
附加檔案
tclsh_ok.jpg
tclsh 測試 ok 的畫面
(45.73 KiB) 尚未被下載
vTcl_ng.jpg
測試 NG 的畫面
(409.99 KiB) 尚未被下載
vTcl_ok.jpg
測試 ok 的畫面
(429.99 KiB) 尚未被下載
Calvin176
剛學走路的小朋友
 
文章: 7
註冊時間: 週二 4月 07, 2015 4:06 pm

Re: 求救!! Tcl 與 VTcl 的差異

文章XO » 週四 4月 16, 2015 8:44 pm

可以說明一下你在 vTcl 裡是怎麼操作執行這個 Test.tcl 的嗎?
照說如果你開啟 vTcl command console,在裡面去下 source 指令,調入那郭 Test.tcl,應該結果會跟 tclsh Test.tcl 一樣的。
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5352
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re: 求救!! Tcl 與 VTcl 的差異

文章Calvin176 » 週五 4月 17, 2015 10:34 am

老師您好!!
我現在的做法是在 vTcl 裡新增一個專案, 因為直接跑會告訴我不是專案不能跑, 然後把 Test.tcl 這段 source code 加到
新專案的 source code 最後面, 再去執行, 現在使用 1.6.1 版本的 vTcl, 附上執行的畫面和版本.
底下是 source code, 再麻煩請老師幫忙解惑, 感恩!!
#!/bin/sh
# the next line restarts using wish\
exec wish "$0" "$@"

if {![info exists vTcl(sourcing)]} {

package require Tk
switch $tcl_platform(platform) {
windows {
option add *Button.padY 0
}
default {
option add *Scrollbar.width 10
option add *Scrollbar.highlightThickness 0
option add *Scrollbar.elementBorderWidth 2
option add *Scrollbar.borderWidth 2
}
}

}

#############################################################################
# Visual Tcl v1.60 Project
#


#################################
# VTCL LIBRARY PROCEDURES
#

if {![info exists vTcl(sourcing)]} {
#############################################################################
## Library Procedure: Window

proc ::Window {args} {
## This procedure may be used free of restrictions.
## Exception added by Christian Gavin on 08/08/02.
## Other packages and widget toolkits have different licensing requirements.
## Please read their license agreements for details.

global vTcl
foreach {cmd name newname} [lrange $args 0 2] {}
set rest [lrange $args 3 end]
if {$name == "" || $cmd == ""} { return }
if {$newname == ""} { set newname $name }
if {$name == "."} { wm withdraw $name; return }
set exists [winfo exists $newname]
switch $cmd {
show {
if {$exists} {
wm deiconify $newname
} elseif {[info procs vTclWindow$name] != ""} {
eval "vTclWindow$name $newname $rest"
}
if {[winfo exists $newname] && [wm state $newname] == "normal"} {
vTcl:FireEvent $newname <<Show>>
}
}
hide {
if {$exists} {
wm withdraw $newname
vTcl:FireEvent $newname <<Hide>>
return}
}
iconify { if $exists {wm iconify $newname; return} }
destroy { if $exists {destroy $newname; return} }
}
}
#############################################################################
## Library Procedure: vTcl:DefineAlias

proc ::vTcl:DefineAlias {target alias widgetProc top_or_alias cmdalias} {
## This procedure may be used free of restrictions.
## Exception added by Christian Gavin on 08/08/02.
## Other packages and widget toolkits have different licensing requirements.
## Please read their license agreements for details.

global widget
set widget($alias) $target
set widget(rev,$target) $alias
if {$cmdalias} {
interp alias {} $alias {} $widgetProc $target
}
if {$top_or_alias != ""} {
set widget($top_or_alias,$alias) $target
if {$cmdalias} {
interp alias {} $top_or_alias.$alias {} $widgetProc $target
}
}
}
#############################################################################
## Library Procedure: vTcl:DoCmdOption

proc ::vTcl:DoCmdOption {target cmd} {
## This procedure may be used free of restrictions.
## Exception added by Christian Gavin on 08/08/02.
## Other packages and widget toolkits have different licensing requirements.
## Please read their license agreements for details.

## menus are considered toplevel windows
set parent $target
while {[winfo class $parent] == "Menu"} {
set parent [winfo parent $parent]
}

regsub -all {\%widget} $cmd $target cmd
regsub -all {\%top} $cmd [winfo toplevel $parent] cmd

uplevel #0 [list eval $cmd]
}
#############################################################################
## Library Procedure: vTcl:FireEvent

proc ::vTcl:FireEvent {target event {params {}}} {
## This procedure may be used free of restrictions.
## Exception added by Christian Gavin on 08/08/02.
## Other packages and widget toolkits have different licensing requirements.
## Please read their license agreements for details.

## The window may have disappeared
if {![winfo exists $target]} return
## Process each binding tag, looking for the event
foreach bindtag [bindtags $target] {
set tag_events [bind $bindtag]
set stop_processing 0
foreach tag_event $tag_events {
if {$tag_event == $event} {
set bind_code [bind $bindtag $tag_event]
foreach rep "\{%W $target\} $params" {
regsub -all [lindex $rep 0] $bind_code [lindex $rep 1] bind_code
}
set result [catch {uplevel #0 $bind_code} errortext]
if {$result == 3} {
## break exception, stop processing
set stop_processing 1
} elseif {$result != 0} {
bgerror $errortext
}
break
}
}
if {$stop_processing} {break}
}
}
#############################################################################
## Library Procedure: vTcl:Toplevel:WidgetProc

proc ::vTcl:Toplevel:WidgetProc {w args} {
## This procedure may be used free of restrictions.
## Exception added by Christian Gavin on 08/08/02.
## Other packages and widget toolkits have different licensing requirements.
## Please read their license agreements for details.

if {[llength $args] == 0} {
## If no arguments, returns the path the alias points to
return $w
}
set command [lindex $args 0]
set args [lrange $args 1 end]
switch -- [string tolower $command] {
"setvar" {
foreach {varname value} $args {}
if {$value == ""} {
return [set ::${w}::${varname}]
} else {
return [set ::${w}::${varname} $value]
}
}
"hide" - "show" {
Window [string tolower $command] $w
}
"showmodal" {
## modal dialog ends when window is destroyed
Window show $w; raise $w
grab $w; tkwait window $w; grab release $w
}
"startmodal" {
## ends when endmodal called
Window show $w; raise $w
set ::${w}::_modal 1
grab $w; tkwait variable ::${w}::_modal; grab release $w
}
"endmodal" {
## ends modal dialog started with startmodal, argument is var name
set ::${w}::_modal 0
Window hide $w
}
default {
uplevel $w $command $args
}
}
}
#############################################################################
## Library Procedure: vTcl:toplevel

proc ::vTcl:toplevel {args} {
## This procedure may be used free of restrictions.
## Exception added by Christian Gavin on 08/08/02.
## Other packages and widget toolkits have different licensing requirements.
## Please read their license agreements for details.

uplevel #0 eval toplevel $args
set target [lindex $args 0]
namespace eval ::$target {set _modal 0}
}
}


if {[info exists vTcl(sourcing)]} {

proc vTcl:project:info {} {
set base .top86
namespace eval ::widgets::$base {
set set,origin 1
set set,size 1
set runvisible 1
}
namespace eval ::widgets_bindings {
set tagslist _TopLevel
}
namespace eval ::vTcl::modules::main {
set procs {
init
main
}
set compounds {
}
set projectType single
}
}
}

#################################
# USER DEFINED PROCEDURES
#
#############################################################################
## Procedure: main

proc ::main {argc argv} {}

#############################################################################
## Initialization Procedure: init

proc ::init {argc argv} {}

init $argc $argv

#################################
# VTCL GENERATED GUI PROCEDURES
#

proc vTclWindow. {base} {
if {$base == ""} {
set base .
}
###################
# CREATING WIDGETS
###################
wm focusmodel $top passive
wm geometry $top 200x200+125+125; update
wm maxsize $top 1440 878
wm minsize $top 116 1
wm overrideredirect $top 0
wm resizable $top 1 1
wm withdraw $top
wm title $top "vtcl"
bindtags $top "$top Vtcl all"
vTcl:FireEvent $top <<Create>>
wm protocol $top WM_DELETE_WINDOW "vTcl:FireEvent $top <<DeleteWindow>>"

###################
# SETTING GEOMETRY
###################

vTcl:FireEvent $base <<Ready>>
}

proc vTclWindow.top86 {base} {
if {$base == ""} {
set base .top86
}
if {[winfo exists $base]} {
wm deiconify $base; return
}
set top $base
###################
# CREATING WIDGETS
###################
vTcl:toplevel $top -class Toplevel
wm focusmodel $top passive
wm geometry $top 609x422+220+159; update
wm maxsize $top 1440 878
wm minsize $top 116 1
wm overrideredirect $top 0
wm resizable $top 1 1
wm deiconify $top
wm title $top "New Toplevel 1"
vTcl:DefineAlias "$top" "Toplevel1" vTcl:Toplevel:WidgetProc "" 1
bindtags $top "$top Toplevel all _TopLevel"
vTcl:FireEvent $top <<Create>>
wm protocol $top WM_DELETE_WINDOW "vTcl:FireEvent $top <<DeleteWindow>>"

###################
# SETTING GEOMETRY
###################

vTcl:FireEvent $base <<Ready>>
}

#############################################################################
## Binding tag: _TopLevel

bind "_TopLevel" <<Create>> {
if {![info exists _topcount]} {set _topcount 0}; incr _topcount
}
bind "_TopLevel" <<DeleteWindow>> {
if {[set ::%W::_modal]} {
vTcl:Toplevel:WidgetProc %W endmodal
} else {
destroy %W; if {$_topcount == 0} {exit}
}
}
bind "_TopLevel" <Destroy> {
if {[winfo toplevel %W] == "%W"} {incr _topcount -1}
}

Window show .
Window show .top86

main $argc $argv

set ret_value 99
load "TestTCL.dll"
after 3000
puts "Load dll OK! \n"
after 1000
SajetTrans Open
puts "Open connect MES OK! \n"
after 1000
SajetTrans DataType 12
puts "Set Data Type OK! \n"
after 1000
SajetTrans DataValue 1
puts "Set Data Value OK! \n"
after 1000
set ret_value [SajetTrans SetData]
after 1000
puts $ret_value
puts "Get Date Time OK! \n"
SajetTrans Close
puts "Close MES OK! \n"
附加檔案
vTcl_result.jpg
執行結果
(183.19 KiB) 尚未被下載
vTcl.jpg
vTcl 版本
(102.42 KiB) 尚未被下載
Calvin176
剛學走路的小朋友
 
文章: 7
註冊時間: 週二 4月 07, 2015 4:06 pm

Re: 求救!! Tcl 與 VTcl 的差異

文章XO » 週五 4月 17, 2015 9:38 pm

好久沒玩這 vTcl 了... 剛剛去下載了 1.6.0a3 版,用我機器上 ActiveTcl 8.5.12 版 以及 8.6b3 版,跑不起來!
上網查了一下發覺要在 tkcon.tcl 裡頭,把死心眼要 Tk 8.5 版的要求放寬:

圖檔

之後就可以跑了,但是 New 一個 Toplevel 視窗元件時,會被吐朝:

圖檔

網搜訊息找到這一篇討論串:vtcl and ActiveTcl 8.5 on XP

依文章建議做了三處更正 ... 之後,總算可以動了! vTcl 有些年紀了,好像會與 8.5 以後的新版 Tcl 犯沖。
再進一步試加入你的程式碼,到 vTcl 產生出來的程式碼裡,跑起來並不會造成 runtime 停止運作的,只會抱怨:

圖檔

我沒有你的 TestTcl.dll 無法複製錯誤狀況。

感覺是你這 DLL 載入時出了問題,你有沒有用 tclkit 直接在 vTcl 之外執行過這程式,也一樣會出現 runtime 停止運作狀況嗎?
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5352
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re: 求救!! Tcl 與 VTcl 的差異

文章Calvin176 » 週一 4月 20, 2015 11:22 am

感謝老師花時間幫我試這個問題, 我之前也有發生 couldn't load library "TestTCL.dll" 的問題, 後來發現只要將 "tcl85.dll", 放在同資料夾下,
就可以解決這個問題, 所以應該不是載入 DLL時出問題, 是執行 DLL 時出問題.
另外發現一個狀況, 在開 vTcl 時, 小視窗內會顯示 loading lib..., 所以是不是自己寫程式, 必須將這些 lib 都 load 進來才可以? 然後又發現找不到 lib_vu.tcl, 這是不是也一定要 laod 進來呢?
Calvin176
剛學走路的小朋友
 
文章: 7
註冊時間: 週二 4月 07, 2015 4:06 pm

Re: 求救!! Tcl 與 VTcl 的差異

文章XO » 週二 4月 21, 2015 8:50 am

你應該是下載 vtcl-modif-20120103.kit 這個 starkit 版本的 vTcl 吧!?
你是用 tclkit 去執行這個 starkit (或是直接 click vtcl-modif-20120103.kit) 的嗎?

要不要試試用 CMD 視窗,在 vtcl-modif-20120103.kit 所在資料夾處,下指令

代碼: 選擇全部
wish vtcl-modif-20120103.kit
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5352
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re: 求救!! Tcl 與 VTcl 的差異

文章XO » 週四 4月 23, 2015 10:40 pm

嗯!會建議改採 wish 去取代 Tclkit 是有原因的...

請參看這一篇: Need tcl85.dll for tclkit 8.5.9
Tclkit 這個 starpack 的 VFS 裡頭並沒有附上 tcl86.dll,感覺搭配錯誤版本的 tcl86.dll 是造成 Tclkit 當機的原因(我猜的) ...

我沒有你的 dll 做測試,便自己上網找來三郭範例, namely gethost.c, hello.c 以及 foo.c 透過 Visual Studio 2008 的 cl.exe 搭配 ActiveTcl 8.6b3 裡的 header files 與 library,做成 dll,同時再以同一個 ActiveTcl 8.6b3 裡的 wish 開啟 vTcl.kit,做出 AccessDLL 專案,用上 load 載入前述 DLL 並加以執行,一切是 OK 的。

  1. gethostbyname as Windows DLL
  2. Hello World as a C extension
  3. load — Load machine code and initialize new commands 裡頭的 sample code fooCmd

但是我拿 tclkit8.6.3 與 8.6.4 都無法載入 DLL,即便我把 ActiveTcl 8.6b3 裡頭的 tcl86.dll 借用過來也沒用,但是我沒法創造出你 Tclkit 會當機的狀況。
上面引述那篇文章的 Tclkit 當機狀況疑似應該就是你遇到的,我在猜應該是跟所載入的 dll 不同,而有不同的結果。
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5352
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re: 求救!! Tcl 與 VTcl 的差異

文章XO » 週五 4月 24, 2015 9:42 am

利用幾個上述的 DLL 範例,我用 vTcl 做了個簡單應用程式 AccessDLL 把他們兜進來 ...

圖檔

基本上,在 vTcl (Visual Tcl) 裡,拖、拉、點、放、編輯出這個簡單測試程式:

  1. 在 function list 裡 click init 模組,主要是把兩郭 (這裡我試了 gethost 與 hello) DLLs load 進來:

    圖檔

  2. 我給了個 Label 元件放在視窗裡下半截,用來顯示訊息用,將他關連到變數 msg 以便於操作。

  3. 拉了 button 改字樣為 Hello,在 Attribute editor 裡頭的 command 欄位鍵入:


    圖檔

  4. 拉個 button 改成 bye,按下時執行 command: set msg 881 (把訊息區設為 881)。

  5. 上排最右邊拉一個 Entry 元件做輸入主機名稱用,關連到變數 host。

  6. 最後再建一個 button 改為 Get Host,command 設為:

    圖檔


大功告成! 在 vTcl 裡執行,或是在外頭用我前些年安裝的 ActiveTcl 8.6b3 裡的 wish 跑起來是都 OK 的啦!

BTW, 我是透過 ActiveTcl 8.6b3 裡的 header files 與 Library 編譯鏈結出 hello.dll 與 gethost.dll 的。
跑 vTcl 的時候也是用 ActiveTcl 8.6b3 裡的 wish 來啟動,我試過 8.6 建好的 dll 無法拿 8.5 的 ActiveTcl 來使用。
同樣的用 Tclkit 的話,是不 work 的 ...
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5352
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re: 求救!! Tcl 與 VTcl 的差異

文章XO » 週五 4月 24, 2015 11:28 am

喔!我是用 Visual Studio 2008 的 cl.exe,透過如下指令編譯出 DLL 的 (以 hello.dll 為例):

圖檔

幾個程式碼詳如附件 ...
附加檔案
hello.c
Tcl C Extension DLL sample#3
(876 Bytes) 被下載 65 次
gethost.c
Tcl C Extension DLL sample#2
(3.52 KiB) 被下載 67 次
foo.c
Tcl C Extension DLL sample#1
(842 Bytes) 被下載 66 次
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5352
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re: 求救!! Tcl 與 VTcl 的差異

文章Calvin176 » 週一 4月 27, 2015 2:41 pm

老師您好!
我後來發現當機的原因, 是因為我的 dll 檔呼叫 Tcl_SetResult() 或 Tcl_SetObjResult() function 時造成當機的, 只要把這個 function mark 掉, 程式就可以往下跑了, 因為要把 server 回應的訊息給回傳回來, 給程式判斷做處理, 所以必須要呼叫 Tcl_SetResult() 或 Tcl_SetObjResult() function, 是不是有其他的 function 可以用? 或是有其他方法?
Calvin176
剛學走路的小朋友
 
文章: 7
註冊時間: 週二 4月 07, 2015 4:06 pm

Re: 求救!! Tcl 與 VTcl 的差異

文章XO » 週一 5月 04, 2015 4:25 pm

沒有確切的現場環境可資觀察,粉難揣摩問題可能的原因!
不過你要不要用下列關鍵字上 Google 求籤卜卦去?

代碼: 選擇全部
tclkit crash on Tcl_SetResult() or Tcl_SetObjResult()


我看到有說 string 要補上 terminated null,也就是要做成 null terminated string!
也有說 tcl 或 wish 裡 OK,換到 tclkit 裡來執行會 crashed 的 ...

就不知道哪個是你這問題的 likely cause(s), 加油囉~~~
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5352
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.


回到 內嵌與腳本化(Embedding & Scripting)

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客

cron