2015-07-03 5 views
0

У меня есть tcl-скрипт с именем main.tcl в папке с именем App. Одна из строк в скрипте использует команду из twapi module (эта строка фактически находится в proc, и я пытаюсь свести к минимуму приложение в системный трей, когда пользователь закрывает приложение через кнопку окна «X»):Загрузка значка из набора с помощью twapi

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 файла в том же каталоге, что и .exe, но я хочу, чтобы избежать этого как можно больше, и только стенд файл .exe. Я попытался с помощью полного пути с:

set hand [twapi::load_icon_from_file [file join [pwd] App.exe tclkit.ico]] 

, который обычно работает, когда я хочу, чтобы прочитать файл (.txt, .png файлы и т.д.) в пределах .exe, без успеха.

В основном, есть ли способ, позволяющий .exe загружать файл .ico из самого себя или в другое обходное решение, которое не требует какой-либо зависимости от файла вне приложения .exe?

+1

Я * думаю * базовый Windows API принимает имя файла, поэтому вам нужно скопировать файл. Вы можете скопировать во временный файл и указать это имя. (Так работает 'load' в Windows ...) –

+1

@DonalFellows Спасибо, я не думал о создании временного файла. Я сделал «копию файла», чтобы скопировать значок из exe в текущий каталог (затем удалить его, как только это уже не понадобилось), и это работает как шарм. Я бы принял решение в качестве ответа :) – Jerry

ответ

1

Основная проблема заключается в том, что соответствующий Windows API фактически принимает имя файла, а не то, что легче переносить загрузку из архива (например, буфер). Это означает, что вам нужно скопировать файл из архива где-нибудь, а затем передать это имя системному вызову. Это на самом деле то, что Tcl делает внутренне для load, когда он вытаскивает DLL из источника, который напрямую не отображается ОС; он не делает это автоматически для TWAPI, хотя, поскольку эта библиотека занимает философское положение как просто тонкая оболочка и позволяет вызывающему управлять последствиями (что означает, что вы можете легко делать больше трюков, если вы изобретательны).

Я предлагаю скопировать файл во временный файл где-нибудь (т. Е. Стандартное расположение для этих вещей: Tcl 8.6 has file tempfile, чтобы помочь с этим трюком), а затем передать полное имя файла в вызов TWAPI. Я думаю, что везде в Windows API вы можете передать простую имя файла, вы также можете передать полное имя файла. (Это на самом деле очень удобно ...)

Смежные вопросы