Страница 124 из 243

Добавлено: Сб июл 01, 2023 18:51
Skif_off
Loopback
Вполне допускаю, что понял неверно :), сейчас ещё раз перечитал с поста от 24го и теперь задача как будто выглядит так: проверять, что в памяти не осталось копий процессов TC, полное имя испоняемого файла которых то же, что и у родительского процесса скрипта.
Если так, то логичнее реализовать в скрипте, вместо автозавершения скрипта в AutorunFinalizeSection.

P.S. Интересно звучит задачка.

Добавлено: Сб июл 01, 2023 22:41
LonerD
Другими словами немного подробней.
Есть мой Тотал, настроенный. В Autorun прописан запуск программы, она запускается и работает в фоне. Я могу запускать несколько копий моего Тотала и закрывать их. Всё это время программа должна быть запущена. Когда я закрою последнюю копию моего Тотала - программа должна выгрузиться.
В то же время параллельно я могу запускать чистый Тотал или чужие сборки. Они никак не должны влиять на запуск и закрытие программы.

PS. В моём случае нужная "программа" - это скомпилированный скрипт. Задача на таком уровне решаемая - запоминать или записывать в отдельный файл все PID запускаемого процесса ТС и время от времени опрашивать их. Если все PID выгружены - то выгружается и программа-скрипт.
Но пока не стал усложнять и сделал просто - программа работает до тех пор, пока запущено хоть одно окно любого ТС. :lol:

Добавлено: Пн июл 03, 2023 19:52
Skif_off
LonerD писал(а):... мой Тотал ... несколько копий моего Тотала ...
Т.е. "мой" лежит в конкретной папке, любой не-"мой" - в любом другом каталоге?
LonerD писал(а):запоминать или записывать в отдельный файл все PID запускаемого процесса ТС и время от времени опрашивать их. Если все PID выгружены - то выгружается и программа-скрипт.
Как-то всё вместе не очень понятно звучит :), скрипт сам запускает все другие копии ТС или он для другого? Если второе, то получать и хранить список PID как-то расточительно, на AutoIt добавил бы в скрипт что-то типа такого:

Код: Выделить всё

#NoTrayIcon

#include "WinAPIEx.au3"

; Регистрируем функцию проверки процессов
AdlibRegister("CheckProc", 3000)

Local $sTCExe = _WinAPI_GetProcessFileName($CmdLine[1])
Local $sTCPath = StringRegExpReplace($sTCExe, "\\[^\\]+$", "\")
Local $iTCNameLen = StringLen($sTCPath)

; Тут собственно скрипт

Func CheckProc()
    AdlibUnRegister("CheckProc")
    Local $sTmp
    Local $iCount = 0
    Local $aProcList = ProcessList()
    For $i = 1 To $aProcList[0][0]
        If StringMid($aProcList[$i][1], 1, 8) = "TOTALCMD" Then
            $sTmp = _WinAPI_GetProcessFileName($aProcList[$i][0])
            If StringMid($sTmp, 1, $iTCNameLen) = $sTCPath Then
                $iCount += 1
                ExitLoop
            EndIf
        EndIf
    Next
    If $iCount = 0 Then Exit
EndFunc
$CmdLine[1] - PID родительского ТС, получаем от Autorun и используем для получения каталога TC из полного имени исполняемого файла, раз в 3 секунды перебираем PID'ы, смотрим, где лежат исполняемые файлы и сравниваем.
Если скрипт что-то пишет, то Exit, наверное, стоит заменить на переменную и обрабатывать ее в основном теле скрипта.
ProcessList() можно запускать с параметром и она сама отфильтрует по имени процесса, выйдет покороче, но процессов может быть два, "TOTALCMD.EXE" и "TOTALCMD64.EXE", поэтому только перебор всех.
Есть ещё вариант получить список всех окон, отфильтрованный по "TTOTAL_CMD", но некоторые инструменты можно запускать отдельным процессом...

Добавлено: Пт июл 14, 2023 01:15
LonerD
Время от времени стали возникать непонятные проблемы (может они и раньше возникали, просто Тоталом менее активно пользовался).

В autorun.cfg прописаны переменные окружения. Например,
SetEnv /A /EV PATH ;%commander_path%\System
SetEnv /EV TCFS %commander_path%\Plugins\exe\TCFS2\TCFS2.exe
и прочие.

Иногда Тотал теряет их. И при попытке выполнить команду, содержащую такую переменную, выдаёт ошибку, что "такого файла не существует".
Нечасто, может раз-два в неделю. Не могу понять причину и закономерности, почему так происходит. После перезапуска Тотала всё снова работает.
Может кто сталкивается?
Или плагин Autorun выгружается? (по какой причине это может происходить? командой выгрузки плагинов не пользуюсь). Или работа назначенных при запуске переменных не зависит от него?

Добавлено: Вс июл 16, 2023 22:10
Loopback
LonerD писал(а):Или плагин Autorun выгружается? (по какой причине это может происходить? командой выгрузки плагинов не пользуюсь). Или работа назначенных при запуске переменных не зависит от него?
Да, переменные окружения после создания не зависят от состояния запуска Autorun.

Больше добавить ничего не могу, не сталкивался с таким. Если при возникновении проблемы посмотреть переменные плагином EnvVariables, их содержимое выглядит нормально?

Добавлено: Вс июл 16, 2023 22:42
LonerD
Loopback писал(а):Если при возникновении проблемы посмотреть переменные плагином EnvVariables, их содержимое выглядит нормально?
Я несколько раз быстренько перезапускал Тотал, а потом только вспоминал, что забыл посмотреть список переменных. :roll:

Добавлено: Пт июл 28, 2023 22:18
LonerD
Опять отвалились переменные на ровном месте.

В плагине Autorun прописано так:

Код: Выделить всё

SetEnv /A /EV PATH ;%commander_path%
SetEnv /A /EV PATH ;%commander_path%\System
В %commander_path%\System лежит файл Hidcon.exe для скрытия консольных окон. И есть несколько пользовательских команд, начинающихся с конструкции:
cmd=Hidcon.exe %comspec% /c

Запускаю последовательно несколько команд, потом оп - через пару секунд следующая уже не запускается. Посмотрел плагином EnvVariables - добавленные значения в переменной PATH пропали. Перезапустил Тотал, попробовал снова, воспроизвести пропадание не удалось.

Заметил ошибки в моей записи.
1. Для чего у меня было /EV - не знаю.
2. Точку с запятой правильнее ставить в конце пути, иначе в тексте переменной получится ;;
Правильно будет вот так:

Код: Выделить всё

SetEnv /A PATH %commander_path%;
SetEnv /A PATH %commander_path%\System;
-----------------------
Но выявил и другую проблему, которая касается непосредственно плагина.
Время от времени перезапускаю Тотал. Не закрываю, а перезапускаю утилитой Tinny TC Restarter. Оказывается, в конце переменной PATH накапливаются записи вида

Код: Выделить всё

;D:\TCDL;D:\TCDL\System;D:\TCDL;D:\TCDL\System;D:\TCDL;D:\TCDL\System;D:\TCDL;D:\TCDL\System;
Может, Windows время от времени запускает внутреннюю проверку состояния системы, обнаруживает это непотребство и удаляет подозрительные записи.

По справке:
При использовании опции /A плагин проверяет наличие добавляемого текста в конце значения переменной и не добавляет его повторно.
На деле это почему-то не работает.

Windows 11 x64, TC 11 RC3, Autorun 2.2.10 beta.
Попробовал более ранние версии Autorun - поведение то же самое.

Добавлено: Сб июл 29, 2023 21:25
Loopback
LonerD писал(а):Запускаю последовательно несколько команд, потом оп - через пару секунд следующая уже не запускается. Посмотрел плагином EnvVariables - добавленные значения в переменной PATH пропали. Перезапустил Тотал, попробовал снова, воспроизвести пропадание не удалось.
Интересно, получается, что пропадают добавленные записи в PATH. В принципе, PATH достаточно критичная переменная, может это работа антивируса какого?
LonerD писал(а):1. Для чего у меня было /EV - не знаю.
Переключатель /EV остался от совсем ранних времён, когда он включал разворачивание переменных. Сейчас он ничего не делает, т.к. разворачивание включено по умолчанию, а отключается с помощью /EV-.
LonerD писал(а):2. Точку с запятой правильнее ставить в конце пути, иначе в тексте переменной получится ;;
А это зависит от конкретной системы, что туда записано. У меня в конце PATH нет точки с запятой. В принципе, в случае сомнений правильнее проверять наличие ; в конце исходной переменной перед дозаписью.
LonerD писал(а): Оказывается, в конце переменной PATH накапливаются записи вида
В принципе, тут всё согласно документации - проверяется текст в конце, а тут для каждой команды предыдущий текст будет другой. Т.е. чтобы всё сработало, надо устанавливать весь текст одной командой:

Код: Выделить всё

SetEnv /A PATH %commander_path%;%commander_path%\System;
Возможно, стоит добавить уточнение в справку.
LonerD писал(а):Может, Windows время от времени запускает внутреннюю проверку состояния системы, обнаруживает это непотребство и удаляет подозрительные записи.
Содержимое переменной PATH, с которой оперирует процесс тотала - унаследованное, т.е. изменение системного PATH после запуска TC уже не повлияет на PATH процесса тотала. Ну вроде так всегда раньше было, может что-то в 11 поменялось...

Добавлено: Сб авг 05, 2023 20:22
LonerD
Loopback писал(а):Т.е. чтобы всё сработало, надо устанавливать весь текст одной командой:

Код: Выделить всё

SetEnv /A PATH %commander_path%;%commander_path%\System;
Теперь всё отлично, лишние записи не появляются.

Добавлено: Пн авг 07, 2023 01:32
yozhik
Вот такой вариант окошка копирования F5/F6 в TC 11.00 на Win 10:
Изображение

[cut="И его код:"]

Код: Выделить всё

LoadLibrary 'Plugins\Autorun_ModifyDialogs.dll'
IniRead CRNTLNG  %COMMANDER_INI% "Configuration" "LanguageIni"
IniRead AUTOSIZE %COMMANDER_INI% "Configuration" "AutoSizeDialogs" 1

# cm_Copy, cm_RenMove F5/F6
If %AUTORUN_TCARCH% = 32 Then
  If %AUTOSIZE% = 1 Then
    AddDialog DIALOG_COPYMOVE
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:8  /W:-7  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:67 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-223        "TButton" 4 "" #Tree
      AddControl /X:-20  /W:-18 "TButton" 1 "" #F2
      AddControl /X:-167 /W:-78 "TButton" 2 "⌵" #Options
      AddControl /X:329  /W:-18 "TButton" 5 "" #OK
      AddControl /X:106  /W:2   "TButton" 3 "" #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:8  /W:-7  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:67 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-223        "TButton" 4 "" #Tree
      AddControl /X:-20  /W:-18 "TButton" 1 "" #F2
      AddControl /X:329  /W:-18 "TButton" 5 "" #OK
      AddControl /X:106  /W:2   "TButton" 3 "" #Cancel
  Else # %AUTOSIZE% = 0
    AddDialog DIALOG_COPYMOVE
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-4  /W:5  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:64 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-225        "TButton" 4 "" #Tree
      AddControl /X:-19  /W:-18 "TButton" 1 "" #F2
      AddControl /X:-169 /W:-78 "TButton" 2 "⌵" #Options
      AddControl /X:330  /W:-18 "TButton" 5 "" #OK
      AddControl /X:106  /W:2   "TButton" 3 "" #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-4  /W:5  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:64 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-225        "TButton" 4 "" #Tree
      AddControl /X:-19  /W:-18 "TButton" 1 "" #F2
      AddControl /X:330  /W:-18 "TButton" 5 "" #OK
      AddControl /X:106  /W:2   "TButton" 3 "" #Cancel
  EndIf
Else # %AUTORUN_TCARCH% = 64
  If %AUTOSIZE% = 1 Then
    AddDialog DIALOG_COPYMOVE
      AddControl /W:-20         "Button" 5  "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:10  /W:-10  "Button" 3 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:68 /W:-65 "Button" 3  "" #MD5
      EndIf
      AddControl /X:-223        "Button" 7  "" #Tree
      AddControl /X:-20  /W:-18 "Button" 1  "" #F2
      AddControl /X:-167 /W:-78 "Button" 2  "⌵" #Options
      AddControl /X:329  /W:-18 "Button" 8  "" #OK
      AddControl /X:106  /W:2   "Button" 6  "" #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl /W:-20         "Button" 10 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:10  /W:-10 "Button" 8 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:68 /W:-65 "Button" 8  "" #MD5
      EndIf
      AddControl /X:-223        "Button" 12 "" #Tree
      AddControl /X:-20  /W:-18 "Button" 6  "" #F2
      AddControl /X:329  /W:-18 "Button" 13 "" #OK
      AddControl /X:106  /W:2   "Button" 11 "" #Cancel
  Else # %AUTOSIZE% = 0
    AddDialog DIALOG_COPYMOVE
      AddControl                "Button" 0  ""
      AddControl /W:-20         "Button" 4  "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-5  /W:5  "Button" 1  "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:65 /W:-65 "Button" 1  "" #MD5
      EndIf
      AddControl /X:-225        "Button" 6  "" #Tree
      AddControl /X:-20  /W:-18 "Button" 2  "" #F2
      AddControl /X:-167 /W:-78 "Button" 3  "⌵" #Options
      AddControl /X:331  /W:-18 "Button" 7  "" #OK
      AddControl /X:107  /W:2   "Button" 5  "" #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl                "Button" 0  ""
      AddControl /W:-20         "Button" 9  "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-5  /W:5  "Button" 1  "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:65 /W:-65 "Button" 1  "" #MD5
      EndIf
      AddControl /X:-225        "Button" 11 "" #Tree
      AddControl /X:-20  /W:-18 "Button" 7  "" #F2
      AddControl /X:331  /W:-18 "Button" 12 "" #OK
      AddControl /X:107  /W:2   "Button" 10 "" #Cancel
  EndIf
EndIf

ModifyDialogs
[/cut]
Это при шрифте для диалогов Segoe UI, 9.
Loopback
В коде, в 64-битной части есть пара строк:

Код: Выделить всё

AddControl                "Button" 0  ""
Без них отказывались работать строки с Button 1, вот такие:

Код: Выделить всё

AddControl /X:-5  /W:5  "Button" 1  "" #MD5
Точнее, вначале когда я написал строку с Button 1, она не работала. Потом стал экспериментировать, проверять где какие instance, и при добавлении Button 0 вдруг заработала Button 1. Потом, после того, как весь код был готов, Button 1 вроде заработала и без Button 0. Но я уж не стал ничего трогать, оставил нули на всякий пожарный. Как думаете, почему такое поведение? Я сам ума не приложу.

Добавлено: Пн авг 07, 2023 22:20
Loopback
yozhik
Трудно сказать. Нулевой экземпляр не имеет смысла, т.к. нумерация начинается с 1, для него никогда не будет найден хэндл контрола и следовательно, не будет производиться никаких действий. А вот почему сначала не работало - в прошлом году мы уже сталкивались с каким-то странным несовпадением экземпляров в x64, возможно это что-то из той же оперы.

Добавлено: Пн авг 07, 2023 22:57
yozhik
Сегодня повторилось с двумя другими диалогами. В одном код «промахивался» мимо экземпляров, пока не подставил вызов нулевого — сразу заработало. А во втором случае уже в настроенном (вчера) диалоге перестал отображаться назначенный кнопке текст (я вместо «Справка» назначил «?»). Вписал в код вызов нулевого — всё встало на места.

Скажите, пожалуйста, а не трудоёмко ли будет добавить в AddControl возможность вместо текста назначать иконку? Например, как-то так:

Код: Выделить всё

AddControl /W:-40 "TButton" 3 %ICON%,8
В переменной адрес к *.dll, и после запятой номер иконки в наборе. Я сегодня дооолго искал хоть какой подходящий символ для кнопки «Дерево». Не нашёл, нету. А так бы что-нибудь такое поставил Изображение, очень было бы удобно.

Добавлено: Вт авг 08, 2023 22:22
Loopback
yozhik писал(а):Вписал в код вызов нулевого — всё встало на места.
Я так понимаю, это только в x64? Такое впечатление, что что-то не инициализируется без предварительного холостого прогона, но что именно, неясно. Посмотрел наиболее очевидные места, проблем не увидел. Хорошо бы, конечно, выделить минимальный код, при котором проблема повторяется...
yozhik писал(а):а не трудоёмко ли будет добавить в AddControl возможность вместо текста назначать иконку?
Без сложностей иконку можно поставить только на стандартные кнопки и static-контролы. Наследники static в формах TC не используются, остаются только кнопки. В их основе стандартный button, но это же delphi/lazarus, как они себя поведут, без тестов непонятно. Если нормально, то должно быть не слишком сложно.

Добавлено: Ср авг 09, 2023 00:46
yozhik
Loopback писал(а):Я так понимаю, это только в x64?
Нет-с. И в 32-битном тоже.
Loopback писал(а):выделить минимальный код, при котором проблема повторяется...
Вот к счастью у меня сразу воспроизвелось. Уточним: Тотал 11.00 32/64, Windows 10 21H2 64bit. Запускаю 32-битный TC:
Изображение Изображение
Я прошу прощения, [s]давайте я вам откопирую всё, что для ModifyDialogs наваял[/s] (в следующем посте сообразил и сделал краткий код как вы просили). Я себе плохо представляю механизмы всей этой кухни, а вдруг там что-то ещё влияет. Но у меня всё прокомментировано, так что вам будет удобно найти нужный отрывок. Сейчас у меня все нулевые вызовы закомментированы. При первом же запуске артефакт проявляется в 2х диалогах: распаковки и атрибутов (на скринах). После раскомментирования нулевых начинает отображаться «?», как и задумано.
[cut="Изменённые диалоги"]

Код: Выделить всё

# ПЛАГИНЫ: ЗАГРУЗКА ......................................................... #
LoadLibrary 'Plugins\Autorun_ModifyDialogs.dll'

# ПЛАГИНЫ: переменные для имён элементов .................................... #
IniRead CRNTLNG  %COMMANDER_INI% "Configuration" "LanguageIni"
If %CRNTLNG% = '' Then
  Set TREEBTN "&Tree"
Else
  LngRead TREEBTN 5002 "%COMMANDER_PATH%\LANGUAGE\%CRNTLNG%"
EndIf
IniRead AUTOSIZE %COMMANDER_INI% "Configuration" "AutoSizeDialogs" 1
IniRead FONTNAME %COMMANDER_INI% "AllResolutions" "FontNameDialog"
IniRead FONTSIZE %COMMANDER_INI% "AllResolutions" "FontSizeDialog"

# ПЛАГИНЫ: MODIFY_DIALOGS ................................................... #
# Диалог cm_CopySamePanel Shift+F5/F6
# AUTOSIZE, FONTNAME, FONTSIZE здесь не влияют
If %AUTORUN_TCARCH% = 32 Then
  AddDialog    /W:105 /CENTER:1 "TCheckComboBox"
  AddControl   /W:109       "TMyComboBox" 1
  AddControl           /Y:4 "TMyCheckBox" 2 "" #NTFS
  AddControl           /Y:2 "TMyCheckBox" 1 "" #MD5
  AddCondition /TEXT            "TButton" 1 %TREEBTN%
  AddControl   /X:-222          "TButton" 1 "" #Tree
  AddControl   /X:257           "TButton" 3 "" #OK
  AddControl   /X:106           "TButton" 2 "" #Cancel
Else
  AddDialog    /W:105 /CENTER:1 "TCheckComboBox"
  AddControl   /W:109      "LCLComboBox" 1 "" # м.б. когда-то заработает :(
  AddCondition /TEXT            "Button" 3 %TREEBTN%
  AddControl           /Y:6     "Button" 6 "" #NTFS
  AddControl           /Y:4     "Button" 2 "" #MD5
  AddControl   /X:-224 /Y:-8    "Button" 3 "" #Tree
  AddControl   /X:253  /Y:-8    "Button" 5 "" #OK
  AddControl   /X:102  /Y:-8    "Button" 4 "" #Cancel
EndIf

# Диалог создания файла cm_EditNewFile Shift+F4
# кнопку Дерево переносим на левый край, кнопки OK и Cancel справа вместе
# AUTOSIZE, FONTNAME, FONTSIZE здесь не влияют
If %AUTORUN_TCARCH% = 32 Then
  AddDialog    "TCOMBOINPUT"
  AddCondition /TEXT          "TButton" 1 %TREEBTN%
  AddControl   /X:-149 /W:-28 "TButton" 1 "" #Tree
  AddControl   /X:-2          "TButton" 2 "" #Cancel
  AddControl   /X:2           "TButton" 3 "" #OK
Else
  AddDialog    "TCOMBOINPUT"
  AddCondition /TEXT           "Button" 1 %TREEBTN%
  AddControl   /X:-149 /W:-28  "Button" 1 "" #Tree
  AddControl   /X:-2           "Button" 2 "" #Cancel
  AddControl   /X:2            "Button" 3 "" #OK
Endif

# Диалог атрибутов cm_SetAttrib
If %AUTORUN_TCARCH% = 32 Then
  If %AUTOSIZE% = 1 Then
    AddDialog "TATTRIBDLG"
    # AddControl                "TButton" 0
    AddControl /X:-330 /W:-80 "TButton" 7 "?" #Help
    AddControl /X:208         "TButton" 9 ""  #OK
    AddControl /X:204         "TButton" 8 ""  #Cancel
  Else
    AddDialog "TATTRIBDLG"
    # AddControl                "TButton" 0
    AddControl /X:-331 /W:-80 "TButton" 7 "?" #Help
    AddControl /X:207         "TButton" 9 ""  #OK
    AddControl /X:203         "TButton" 8 ""  #Cancel
  Endif
Else
  If %AUTOSIZE% = 1 Then
    AddDialog "TATTRIBDLG"
    # AddControl                "Button" 0
    AddControl /X:-329 /W:-80 "Button" 11 "?" #Help
    AddControl /X:207         "Button" 13 ""  #OK
    AddControl /X:203         "Button" 12 ""  #Cancel
  Else
    AddDialog "TATTRIBDLG"
    # AddControl                "Button" 0
    AddControl /X:-330 /W:-80 "Button" 11 "?" #Help
    AddControl /X:206         "Button" 13 ""  #OK
    AddControl /X:202         "Button" 12 ""  #Cancel
  Endif
Endif

# Диалог упаковки cm_PackFiles Alt+F5
If %AUTORUN_TCARCH% = 32 Then
  If %AUTOSIZE% = 1 Then
    AddDialog  /H:13 "TDLGZIP"
    # AddControl                      "TButton" 0
    AddControl /X:-236 /Y:12        "TButton" 4 ""  #Tree
    AddControl /X:167  /Y:12        "TButton" 5 ""  #OK
    AddControl /X:70   /Y:12        "TButton" 3 ""  #Cancel
    AddControl /X:70   /Y:12 /W:-70 "TButton" 1 "?" #Help
  Else
    AddDialog  /H:14 "TDLGZIP"
    # AddControl                      "TButton" 0
    AddControl /X:-236 /Y:14        "TButton" 4 ""  #Tree
    AddControl /X:167  /Y:14        "TButton" 5 ""  #OK
    AddControl /X:70   /Y:14        "TButton" 3 ""  #Cancel
    AddControl /X:70   /Y:14 /W:-70 "TButton" 1 "?" #Help
  EndIf
Else
  If %AUTOSIZE% = 1 Then
    AddDialog  /H:13 "TDLGZIP"
    # AddControl                      "Button" 0
    AddControl /X:-230 /Y:12        "Button" 21 ""  #Tree
    AddControl /X:170  /Y:12        "Button" 22 ""  #OK
    AddControl /X:75   /Y:12        "Button" 20 ""  #Cancel
    AddControl /X:75   /Y:12 /W:-69 "Button" 5  "?" #Help
  Else
    AddDialog  /H:14 "TDLGZIP"
    # AddControl                      "Button" 0
    AddControl /X:-232 /Y:14        "Button" 21 ""  #Tree
    AddControl /X:170  /Y:14        "Button" 22 ""  #OK
    AddControl /X:75   /Y:14        "Button" 20 ""  #Cancel
    AddControl /X:75   /Y:14 /W:-68 "Button" 5  "?" #Help
  Endif
Endif

# Диалог распаковки cm_UnpackFiles Alt+F9/Alt+F6
If %AUTORUN_TCARCH% = 32 Then
  AddDialog    "TDLGUNZIPALL"
  # AddControl                  "TButton" 0
  AddControl         /W:2 "TMyComboBox" 1 ""  #Auto-detect
  AddControl   /X:80 /W:-80   "TButton" 1 "?" #Help
  If %AUTOSIZE% = 1 Then
    AddControl /X:-166        "TButton" 3 ""  #Tree
    AddControl /X:202         "TButton" 4 ""  #OK
    AddControl /X:82          "TButton" 2 ""  #Cancel
  Else
    AddControl /X:-167        "TButton" 3 ""  #Tree
    AddControl /X:205         "TButton" 4 ""  #OK
    AddControl /X:84          "TButton" 2 ""  #Cancel
  Endif
Else # %AUTORUN_TCARCH% = 64
    AddDialog  "TDLGUNZIPALL"
    # AddControl                "Button" 0
    AddControl /X:-165        "Button" 4 ""  #Tree
    AddControl /X:201         "Button" 5 ""  #OK
    AddControl /X:82          "Button" 3 ""  #Cancel
    AddControl /X:80 /W:-80   "Button" 2 "?" #Help
Endif

# Диалог копирования/перемещения cm_Copy/cm_RenMove F5/F6
# кнопки слева-направо: Дерево, В очередь, Доп. (со стрелочкой), OK, Отмена
# FONTNAME, FONTSIZE не стал пока указывать
If %AUTORUN_TCARCH% = 32 Then
  If %AUTOSIZE% = 1 Then
    AddDialog DIALOG_COPYMOVE
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:8  /W:-7  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:67 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-223        "TButton" 4 ""  #Tree
      AddControl /X:-20  /W:-18 "TButton" 1 ""  #F2
      AddControl /X:-164 /W:-86 "TButton" 2 "⌵" #Options
      AddControl /X:329  /W:-18 "TButton" 5 ""  #OK
      AddControl /X:106  /W:2   "TButton" 3 ""  #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:8  /W:-7  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:67 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-223        "TButton" 4 ""  #Tree
      AddControl /X:-20  /W:-18 "TButton" 1 ""  #F2
      AddControl /X:329  /W:-18 "TButton" 5 ""  #OK
      AddControl /X:106  /W:2   "TButton" 3 ""  #Cancel
  Else # %AUTOSIZE% = 0
    AddDialog DIALOG_COPYMOVE
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-4  /W:5  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:64 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-225        "TButton" 4 ""  #Tree
      AddControl /X:-19  /W:-18 "TButton" 1 ""  #F2
      AddControl /X:-165 /W:-86 "TButton" 2 "⌵" #Options
      AddControl /X:330  /W:-18 "TButton" 5 ""  #OK
      AddControl /X:106  /W:2   "TButton" 3 ""  #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-4  /W:5  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:64 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-225        "TButton" 4 ""  #Tree
      AddControl /X:-19  /W:-18 "TButton" 1 ""  #F2
      AddControl /X:330  /W:-18 "TButton" 5 ""  #OK
      AddControl /X:106  /W:2   "TButton" 3 ""  #Cancel
  EndIf
Else # %AUTORUN_TCARCH% = 64
  If %AUTOSIZE% = 1 Then
    AddDialog DIALOG_COPYMOVE
      AddControl /W:-20         "Button" 5  ""  #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:10  /W:-10 "Button" 3 ""  #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:68 /W:-65 "Button" 3  ""  #MD5
      EndIf
      AddControl /X:-223        "Button" 7  ""  #Tree
      AddControl /X:-20  /W:-18 "Button" 1  ""  #F2
      AddControl /X:-163 /W:-85 "Button" 2  "⌵" #Options
      AddControl /X:329  /W:-18 "Button" 8  ""  #OK
      AddControl /X:106  /W:2   "Button" 6  ""  #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl /W:-20         "Button" 10 ""  #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:10  /W:-10 "Button" 8 ""  #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:68 /W:-65 "Button" 8  ""  #MD5
      EndIf
      AddControl /X:-223        "Button" 12 ""  #Tree
      AddControl /X:-20  /W:-18 "Button" 6  ""  #F2
      AddControl /X:329  /W:-18 "Button" 13 ""  #OK
      AddControl /X:106  /W:2   "Button" 11 ""  #Cancel
  Else # %AUTOSIZE% = 0
    AddDialog DIALOG_COPYMOVE
      AddControl                "Button" 0  ""
      AddControl /W:-20         "Button" 4  ""  #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-5  /W:5  "Button" 1  ""  #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:65 /W:-65 "Button" 1  ""  #MD5
      EndIf
      AddControl /X:-225        "Button" 6  ""  #Tree
      AddControl /X:-20  /W:-18 "Button" 2  ""  #F2
      AddControl /X:-164 /W:-85 "Button" 3  "⌵" #Options
      AddControl /X:331  /W:-18 "Button" 7  ""  #OK
      AddControl /X:107  /W:2   "Button" 5  ""  #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl                "Button" 0  ""
      AddControl /W:-20         "Button" 9  ""  #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-5  /W:5  "Button" 1  ""  #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:65 /W:-65 "Button" 1  ""  #MD5
      EndIf
      AddControl /X:-225        "Button" 11 ""  #Tree
      AddControl /X:-20  /W:-18 "Button" 7  ""  #F2
      AddControl /X:331  /W:-18 "Button" 12 ""  #OK
      AddControl /X:107  /W:2   "Button" 10 ""  #Cancel
  EndIf
EndIf

ModifyDialogs
[/cut]
Loopback писал(а):Без сложностей иконку можно поставить только на стандартные кнопки и static-контролы.
Ну, и прекрасно, хватит за глаза. Давайте, пожалуйста, попробуем. Если получится, то я бы все «Справки» и «Деревья» под аккуратные контурные иконки «спрятал» :roll:, гораздо бы эргономичней вышло. Можно пока начать только с кнопок — на них иконки точно нужны. А вот пригодится ли это для static-контролов я пока не приглядывался.

Добавлено: Ср авг 09, 2023 21:29
lz57005
LonerD писал(а):Другими словами немного подробней.
Есть мой Тотал, настроенный. В Autorun прописан запуск программы, она запускается и работает в фоне. Я могу запускать несколько копий моего Тотала и закрывать их. Всё это время программа должна быть запущена. Когда я закрою последнюю копию моего Тотала - программа должна выгрузиться.
В то же время параллельно я могу запускать чистый Тотал или чужие сборки. Они никак не должны влиять на запуск и закрытие программы.
Очевидное решение использовать как признак запуска программы наличие/отсутствие PID c нужным ImagePath, а не именем процесса, а при закрытии проверять аналогично процессы с путём %commander_exe% и закрывать программу тоже не по имени, вот пример:

MultiTCruncloseExample.7z

Код: Выделить всё

autorun.cfg
...
ShellExec /SW_HIDE "%COMMANDER_PATH%\utils\StartDummy.bat"
...
Pragma AutorunFinalizeSection
...
ShellExec /SW_HIDE "%COMMANDER_PATH%\utils\StopDummy.bat"
cmd, nircmd, pathpid (самописная утилита которая выдаёт в stdout/stderr pid первого процесса с путём из параметра запуска)

Dummy.exe запустится только с первым экземпляром тотала и закроется с последним, имея ввиду только тоталы и запускаемую программу расположенные в конкретных папках, игнорируя иные экземпляры запущенные из других мест