2011-12-30 61 views
1

我在Windows上有一個TCL/TK應用程序。用相關程序打開文件的最佳方式是什麼?例如,我正在生成PDF,我希望它自動打開。從TCL的相關應用程序打開文件的最佳方式是什麼?

我一直在使用:

proc OpenDocument {filename} { 
    if {[catch { 
     exec rundll32.exe url.dll,FileProtocolHandler $filename & 
    }]} { 
     tk_messageBox -message "Error opening $filename." 
    } 
} 

但我不知道它是多麼旺盛,我想有一個更好的錯誤消息。例如,如何檢測是否安裝了任何程序並與PDF關聯?

我知道許多程序(包括Foxit PDF Reader)在「HKEY_CLASSES_ROOT.extension」下添加一個註冊表項,但Adobe Reader似乎使用了不同的系統。

有沒有最佳做法?我將把我的程序部署到幾百個用戶,並且我想要確信如果有人有奇怪的配置,就不會有普遍的問題。

謝謝。

回答

4

我會寫(對Tcl 8.5)

exec {*}[auto_execok start] "" $filename 

(討論here)。 雖然這可能會顯示一個cmd窗口。

如果你有一個早期的TCL,

eval exec [auto_execok start] {""} [list $filename] 
+0

感謝您的答覆是什麼。我在哪裏可以找到啓動命令的文檔?它附帶哪個版本的Windows?什麼是空白的論據?如何檢測和處理錯誤(即,如果沒有安裝程序來打開該文件會怎麼樣?) – Imbue 2012-01-01 22:04:43

+0

@Imbue:它隨_many_年一起發貨;一個快速的谷歌表示它至少在NT4之後一直存在,可能更多(我不記得它是在98年,還是從未使用過NT3.5)。你的windows _will_版本擁有它。 http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/start.mspx?mfr=true – 2012-01-02 22:55:20

+0

你能告訴我爲什麼這個解決方案比我現在擁有的更好嗎?如何捕獲錯誤或判斷用戶是否有與我想要打開的文件擴展名關聯的應用程序?另外,什麼是空的論據? – Imbue 2012-02-24 18:23:32

0

這裏有一個例子來看看該協會是在registry man page

package require registry 
set ext .tcl 

# Read the type name 
set type [registry get HKEY_CLASSES_ROOT\\$ext {}] 
# Work out where to look for the command 
set path HKEY_CLASSES_ROOT\\$type\\Shell\\Open\\command 
# Read the command! 
set command [registry get $path {}] 

puts "$ext opens with $command" 
相關問題