调用外部程序打开其关联文件一般有两种情况:
第一种:
在windows中文件已与程序自动关联,例如.docx文件会自动关联Word,.pdf文件一般会关联adobe reader或当前设置的默认pdf软件;这种情况下,直接使用如下命令即可:
exec cmd /c "$file_path";
这个命令的本质是调用了cmd来执行打开操作,而其对应的软件路径则由在windows注册表中由文件后缀名关联起来的。
第二种:
没有自动关联起来的文件,例如我想用notepad++打开如下这个自定义后缀的文件: 首先需要知道notepad++主程序路径,如下:然后执行如下命令即可:
exec cmd /c "C:/Program Files/Notepad++/notepad++.exe" \"C:/Users/ZWT/Desktop/test/自定义后缀文件.hyperproc"
但是,有些exe主程序是不支持外部传参的,这点需要注意。
前面这两个命令可能会有一个缺点:部分第三方软件会占用当前进程导致主进程卡死。
所以一般采用多线程来打开文件,这块也分为两种:
第一种:
利用Thread库来实现,如下:
package require Thread;thread::send -async [thread::create] \[list exec cmd "/c" "$file_path"];或package require Threadthread::send -async [thread::create] \[list exec cmd "/c" "C:/Program Files/Notepad++/notepad++.exe" \"C:/Users/ZWT/Desktop/test/自定义后缀文件.hyperproc"];
第二种:
利用twapi库实现, 注意写法 ,-cmdline后面所有的参数,即使是带空格的路径,也要写在一个括号内:package require twapitwapi::create_process "" \-cmdline "C:/Program Files/Notepad++/notepad++.exe \C:/Users/ZWT/Desktop/test/自定义后缀文件.hyperproc;
关于-cmdline的写法,可参考:
【分享】分享一款tcl/tk开发中的小工具 中的窗口操作Tab页:
所以上面的代码,可以这样写:
package require twapitwapi::create_process "" \-cmdline "\"C:/Program Files/Notepad++/notepad++.exe\" \C:/Users/ZWT/Desktop/test/自定义后缀文件.hyperproc"