Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Autorun
Goto page Previous  1, 2, 3 ... 174, 175, 176 ... 184, 185, 186  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Orion9



Joined: 01 Jan 2024
Posts: 716

Post (Separately) Posted: Tue Feb 18, 2025 14:01    Post subject: Reply with quote

Loopback wrote:
Насчет лучший не знаю, можно, конечно и с имеющимися функциями написать, учитывая переполнение, но считаться трафик будет от запуска тотала.

Да, я думал об этом. Именно поэтому решил делать через WMI, так как нужен полный объем трафика. Но надо будет ещё подумать, что делать с интерфейсом. А пока - простая реализация планировщика заданий на Autorun! Very Happy

Окно монитора заданий вызывается при наведении на заголовок.

 usercmd.ini

 Schedule.ini

 Test.aucfg
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1483

Post (Separately) Posted: Wed Feb 19, 2025 13:07    Post subject: Reply with quote

Важное объявление

В ближайшей паре версий будут сделаны существенные изменения, которые, возможно, повлекут за собой неработоспособность некоторых записей в скриптах.

Первый этап

В следующей версии - исправление известной проблемы с лишним разворачиванием переменных в тексте параметров ряда функций в функциональной записи, что связано с разными принципами работы с параметрами в разных записях. Это коснётся всех функций, где было такое разворачивание. К сожалению, в свое время критичность этого была недооценена. Найти приемлемое решение с полным сохранением совместимости не удалось, поэтому было принято решение радикально устранить проблему. Некоторые записи могут перестать работать, но исправить это в скриптах достаточно просто.

Перестанет работать код в функциональной записи, который основывался на разворачивании переменных прямо в тексте:

Code:
Например
FileGetAttr("%COMMANDER_PATH%\Totalcmd.exe")
нужно заменить на
FileGetAttr(COMMANDER_PATH & "\Totalcmd.exe")
или
FileGetAttr(Set("%COMMANDER_PATH%\Totalcmd.exe"))


Если текст с %переменной% содержится в другой переменной и раньше код основывался на разворачивании этого текста в параметре функции, то теперь в функциональной записи разворачивание производиться не будет. Чтобы достичь такого же результата, нужно будет добавить Set для явного разворачивания содержимого переменной:

Code:
path = "%COMMANDER_PATH%\Totalcmd.exe"
Было
FileGetAttr(path)
стало
FileGetAttr(Set(path))


Переключатель /EV-, встречающийся в ряде функций, теперь будет неприменим при записи в ФЗ.

Все записи функций в командном виде должны сохранить работоспособность без изменений.

Второй этап

Также, как следствие из первого этапа, было принято решение оптимизировать синтаксис и избавить его от некоторых послаблений и допущений, которые были сделаны в ранних версиях, что, в частности, позволит более чётко разграничить записи в КЗ и ФЗ.


  • Будет убрана возможность использовать переменные в виде %var% в выражениях, их использование будет ограничено только командной записью функций.
  • Будет убрана директива LegacyExpressions.


Это будет сделано не в ближайшей версии, а скорее всего через одну. Но вносить изменения можно уже сейчас, для этого просто нужно заменить в выражениях (в том числе в вычисляемых строках) использование вида переменных %var% на var. Это означает примерно такое:

Code:
var = %COMMANDER_PATH% & "\Totalcmd.exe"
должно стать
var = COMMANDER_PATH & "\Totalcmd.exe"

len = StrLen(%var%)
должно стать
len = StrLen(var)

ShowHint %"%var%"
должно стать
ShowHint %"var"


Подчеркиваю, только в выражениях. В строках с командной записью менять нужно только содержимое вычисляемых строк.

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

По поводу LegacyExpressions - думаю, вряд ли ещё остался кто-то, использующий старую интерпретацию.


Last edited by Loopback on Mon Mar 03, 2025 00:45; edited 1 time in total
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 716

Post (Separately) Posted: Wed Feb 19, 2025 13:47    Post subject: Reply with quote

Кто сказал, что у Autorun нет своей иконки в трее? Mr. Green

 Hidden text

 Hidden text

Loopback, нет ли здесь ошибок явных или неявных? А то у меня нет полной уверености. Делал по структуре:
https://learn.microsoft.com/en-us/windows/win32/api/shellapi/ns-shellapi-notifyicondataw

А по поводу объявления: хорошо, что идут такие серьёзные изменения, так как с процентами в переменных действительно какая-то путаница. Только регулярками там скорее всего не обойтись, всё-равно придётся код построчно просматривать.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1483

Post (Separately) Posted: Wed Feb 19, 2025 22:25    Post subject: Reply with quote

Orion9
Сначала написал что всё в порядке, но как обычно забыл проверить на x64. На ней функция не работает по причине неправильных смещений. К сожалению, в структурах есть такая неприятная вещь, как выравнивание полей, из-за чего не всегда смещение следующего поля будет равно смещению текущего + его размер.

В связи с чем инициализация под x64 должна выглядеть по-другому:

Code:

Func NotifyIconAdd(ID, CallbackMessage, hIcon, Tip)
    Local NIF_MESSAGE = 0x00000001, _
          NIF_ICON    = 0x00000002, _
          NIF_TIP     = 0x00000004, _
          TIP_MAXCHAR = 128 - 1
    Local buf = Buffer((auPtrSize = 4 ? 956 : 976))   
    buf.Zero()
    If auX64 Then
        buf.SetNum(0,  "dword", buf.size)
        buf.SetNum(8,  "hwnd", AUTORUN_TCHANDLE)
        buf.SetNum(16, "uint", ID, _
                       "uint", BitOR(NIF_MESSAGE, NIF_ICON, NIF_TIP), _
                       "uint", CallbackMessage)
        buf.SetNum(32, "ptr", hIcon)
    Else
        buf.SetNum(0, "dword", buf.size, _   
                      "hwnd", AUTORUN_TCHANDLE, _         
                      "uint", ID, _
                      "uint", BitOR(NIF_MESSAGE, NIF_ICON, NIF_TIP), _
                      "uint", CallbackMessage, _
                      "ptr", hIcon) 
    EndIf

    buf.SetStr(StrLeft(Tip, TIP_MAXCHAR) & Chr(0), (auX64 ? 40 : 24)) # auPtrSize*2 + 4*4
    Return DllCall("Shell32.dll\Shell_NotifyIconW", "uint", 0, "ptr", buf.ptr, "bool")
EndFunc


Еще, для передачи имени файла буфер не нужен, всё необходимое есть в DllCall:

Code:

Func TrayIcon()
    Local i = 0, _
          f = %COMMANDER_PATH% & "\TOTALCMD.EXE", _
          file, hint, _
          hIco = 0         
    #i = 15
    #f = GetKnownFolderPath("System") & "\shell32.dll"
   
    hIco = DllCall("shell32\ExtractIconW", "ptr", AUTORUN_TCHANDLE, "wstr", f, "uint", i, "ptr")
   
    hint = "Autorun " & FileGetVersion(AUTORUN_PATH & "\Autorun.wdx", "FileVersion")
    NotifyIconAdd(1001, 55555, hIco, hint)
    If hIco > 0 Then DllCall("DestroyIcon", "ptr", hIco, "bool")       
EndFunc


Да, и еще надо иконку скрывать перед выходом ТС, иначе в трее остаётся болтаться. Ну и buf в функции надо освобождать (или в static его).

Orion9 wrote:
Только регулярками там скорее всего не обойтись, всё-равно придётся код построчно просматривать

Конечно же не имелось в виду, что всё подряд заменять, пройтись внимательно с поиском и заменой.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 716

Post (Separately) Posted: Thu Feb 20, 2025 00:21    Post subject: Reply with quote

Loopback
Спасибо за уточнения!

Я тоже сразу не догадался проверить в TC x64, но потом обнаружил, что там ничего не работает, т.е. в трее иконка не появляется. Но хорошо, что вы всё поправили и объяснили. Сколько всяких сложностей-то. Это тебе не хухры-мухры Very Happy

Кстати, по поводу сетевого интерфейса. Как вариант, можно сделать выбор из меню.

На основе вашего примера в справке GetDriverList:

 Hidden text

А потом в запросе имя переменной NetworkInterface подставлять. Но это я еще не успел доделать.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 716

Post (Separately) Posted: Tue Feb 25, 2025 13:17    Post subject: Reply with quote

Loopback wrote:
К сожалению, в структурах есть такая неприятная вещь, как...

Для неискушённого пользователя "сюрпризов" там хватает ) Например, не понятно, нужно ли самому считать размер структуры или где-то есть уже готовые таблицы, типа:
 Hidden text

Фрагмент из скрипта AutoHotkey для вызова системного диалога "Выбор цвета". Видимо, автор всё-таки сам делал этот расчёт, поскольку выравнивание (paddiing), если я правильно понимаю, указано неверно Smile

Попробовал сделать на Autorun этот вызов:
 Hidden text

Вроде всё работает ) Правда, в функции нет обработки результата выбора цвета, но он мне не нужен, так как окно диалога вызывается для других целей.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 262

Post (Separately) Posted: Tue Feb 25, 2025 17:02    Post subject: Reply with quote

Хотелось-бы проконсультироваться. Можно-ли прочитать целиком текстовый файл в переменную и поискать в ней нужную информацию?
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1483

Post (Separately) Posted: Tue Feb 25, 2025 21:55    Post subject: Reply with quote

Orion9 wrote:
Например, не понятно, нужно ли самому считать размер структуры или где-то есть уже готовые таблицы, типа:

Готовых и простых для использования калькуляторов я не нашел. Как правило такой подсчет основывается на анализе скомпилированного бинарника или при компиляции со специальными отладочными директивами. В любом случае делать это для каждой структуры весьма неудобно.

Для упрощения расчёта смещений написал небольшую утилитку на Autoit, хотел выложить на днях, но раз зашел разговор, можно и сейчас. Все равно дорабатывать я её в ближайшее время вряд ли буду.

Сложную структуру (со вложенными структурами и объединениями) сразу посчитать вряд ли получится. Но что попроще, или если считать вложенные структуры по-отдельности - думаю, справится. С CHOOSECOLORW справляется Smile

Orion9 wrote:
поскольку выравнивание (paddiing), если я правильно понимаю, указано неверно

Смещения правильные, размеры вроде тоже.

AkulaBig wrote:
Можно-ли прочитать целиком текстовый файл в переменную и поискать в ней нужную информацию?

В данный момент нет, только через скрипт и ProcessExecGetOutput или через DllCall.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 716

Post (Separately) Posted: Wed Feb 26, 2025 13:29    Post subject: Reply with quote

Loopback wrote:
Для упрощения расчёта смещений написал небольшую утилитку на Autoit

Большое спасибо! Посмотрим, что она считает )
Loopback wrote:
Смещения правильные, размеры вроде тоже.

У меня не получилось сделать по той таблице, так что пришлось считать самостоятельно )

Смещения не так страшны, как множество неочевидных типов данных. Хочется больше примеров, чтобы лучше разобраться. Например, никак не могу получить значение из реестра через DllCall:

Code:
Local key = "Console", val = "FaceName", data, size = 128
res = DllCall("Advapi32.dll\RegGetValueW", "handle", 0x80000001, "wstr", key,  "wstr", val, "dword", 0x00000002, "ptr", 0, "wstr:64", @data, "dword*", @size)
MsgBox("Return: " & res & auCRLF & "Data: " & data & auCRLF & "Size: " & size)

Пробовал разные варианты, много вариантов, но всё время пишет "неправильные параметры". Что здесь не так?

AkulaBig
Чуть ранее был пример с и командой type, не подойдёт?
Code:
ProcessExecGetOutput out %COMSPEC% '/c type "%file%"'
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 262

Post (Separately) Posted: Wed Feb 26, 2025 18:04    Post subject: Reply with quote

Orion9 wrote:
Чуть ранее был пример с и командой type, не подойдёт?

Не, это из другой оперы. У меня тема пока одна, мультиязычность. Хотя сейчас отвлекся. Просто я перешел на скрипт Autorun с заменой названия секций. А мне пишут, что теперь инишники только вручную можно править для внесения своих значений. Так что пришлось опять вернуться на au3.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 716

Post (Separately) Posted: Wed Feb 26, 2025 18:17    Post subject: Reply with quote

AkulaBig
Почему из другой оперы? Вопрос же был:
Quote:
Можно-ли прочитать целиком текстовый файл в переменную и поискать в ней нужную информацию?

ProcessExecGetOutput out %COMSPEC% '/c type "%file%"' читает целиком текстовый файл в переменную out, в которой затем можно искать информацию.

Loopback
Так и не понял в чём проблема. Сделал то же самое на Autohotkey - работает без проблем:
Code:
key := "Console", val := "FaceName", size := 128
 data := Buffer(128,0)
 res := DllCall("Advapi32.dll\RegGetValueW", "Ptr", 0x80000001, "Str", key,  "Str", val, "UInt", 0x00000002, "Ptr", 0, "Ptr", data.ptr, "UInt*", &size)
MsgBox("Return: " res . '`n' . "Data: " . StrGet(data, "UTF-16")   . '`n' . "Size: " . size)

А в Autorun никак:
Code:
Local key = "Console", val = "FaceName", size = 128
    Local data = Buffer(128)
    data.Zero()
res = DllCall("Advapi32.dll\RegGetValueW", "ptr", 0x80000001, "wstr", key,  "wstr", val, "dword", 0x00000002, "ptr", 0, "ptr", data.ptr, "dword*", @size)
   
    MsgBox("Return: " & res & auCRLF & "Data: " & data.GetStr() & auCRLF & "Size: " & size)
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 262

Post (Separately) Posted: Wed Feb 26, 2025 18:33    Post subject: Reply with quote

Orion9 wrote:
читает целиком текстовый файл в переменную out, в которой затем можно искать информацию.

Искать-то надо средствами Autorun.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 716

Post (Separately) Posted: Wed Feb 26, 2025 18:48    Post subject: Reply with quote

AkulaBig
Ну так в Autorun есть строковые функции Very Happy Та же StrPos.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 262

Post (Separately) Posted: Wed Feb 26, 2025 19:52    Post subject: Reply with quote

Orion9 wrote:
Ну так в Autorun есть строковые функции

Я в курсе. Надо будет попробовать еще раз. Может и правда с Type получится.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1483

Post (Separately) Posted: Wed Feb 26, 2025 20:22    Post subject: Reply with quote

Orion9 wrote:
Так и не понял в чём проблема. Сделал то же самое на Autohotkey - работает без проблем:

Тут вопрос интерпретации значения первого параметра. Определение HKEY_CURRENT_USER:

((HKEY)(ULONG_PTR)((LONG)0x80000001))

Т.е. в данном случае значение первого параметра должно быть 32-битным беззнаковым целым. Для этого служит тип ulong_ptr, который интерпретирует число как беззнаковое целое с размером указателя. Так всё работает:

Code:
res = DllCall("Advapi32.dll\RegGetValueW", "ulong_ptr", 0x80000001, "wstr", key,  "wstr", val, "dword", 0x00000002, "ptr", 0, "wstr:64", @data, "dword*", @size)


Но тем не менее, это скорее всего можно назвать багом. Такое число должно работать нормально и с типом handle/ptr.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3 ... 174, 175, 176 ... 184, 185, 186  Next
Page 175 of 186

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group