使用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中无处不在,你可以传入一个简单的文件名,你也可以传递一个完整的文件名。 (这实际上非常方便...)

链接地址: http://www.djcxy.com/p/67741.html

上一篇: Loading icon from kit using twapi

下一篇: How to run a .m file from a tcl script (mac)