使用twapi从工具包加载图标
我在名为App
的文件夹中有一个名为main.tcl
的tcl脚本。 脚本中的一行使用来自twapi模块的命令(该行实际上位于proc中,当用户通过'X'窗口按钮关闭应用程序时,我试图将应用程序最小化到系统托盘):
package require twapi
# ... code here
set hand [twapi::load_icon_from_file tclkit.ico]
# ... code here
文件tclkit.ico
与脚本位于同一目录(即在文件夹App
)。
当main.tcl
通过wish
运行时,脚本没有任何问题,但通过命令行将其包装到可执行文件后,
> tclkit sdx.kit wrap App -runtime tclsh863.exe
该可执行文件引发了一个错误,特别是无法找到图标文件:
The system cannot find the file specified.
The system cannot find the file specified.
while executing
"LoadImage $hmod $path $type $opts(width) $opts(height) $flags"
(procedure "twapi::_load_image" line 18)
invoked from within
"twapi::load_icon_from_file tclkit.ico"
(procedure "min_to_tray" line 2)
invoked from within
"min_to_tray"
(command for "WM_DELETE_WINDOW" window manager protocol)
目前的解决方法是将tclkit.ico
文件的副本tclkit.ico
与.exe相同的目录中,但我希望尽可能避免这种情况,并且只有独立的.exe文件。 我尝试使用完整路径:
set hand [twapi::load_icon_from_file [file join [pwd] App.exe tclkit.ico]]
当我想要在.exe中读取文件(.txt,.png文件等)时,它通常工作,但没有成功。
所以基本上,有没有办法让.exe从自身内部加载.ico文件,或者另一种解决方法,它不需要依赖于.exe应用程序之外的文件?
核心问题是,相关的Windows API实际上需要一个文件名,而不是更容易包装加载 - 例如缓冲区的东西。 这意味着您必须将文件从存档中的某处复制出来,然后将该名称传递给系统调用。 事实上,当Tcl从一个对操作系统不直接可见的源代码中提取DLL时,Tcl会在内部进行load
。 但它并不是自动为TWAPI做的,因为该库将哲学定位为简单的包装,并让调用者处理后果(这意味着如果您有创造力,您可以轻松地做更多的技巧)。
我建议将文件复制到某处的临时文件(即,这些东西的标准位置; Tcl 8.6具有file tempfile
以帮助完成这种技巧),然后将完整文件名传递给TWAPI调用。 我认为在Windows API中无处不在,你可以传入一个简单的文件名,你也可以传递一个完整的文件名。 (这实际上非常方便...)