A55555 писал(а):и пока никаких проблем не нашлось, просто летает и Everything как и не было.
В первый раз вы поставили строку после команды "Return", поэтому до нее не дошла очередь (Return осуществляет выход из функции, прерывая ее выполнение). Во втором варианте строка выхода для Everything стоит перед Return, поэтому успевает отрабатывать.
AkulaBig писал(а):Значит надо искать проблемы в коде, которые не позволяют Everything выгрузиться. У меня этот код работает много лет.
Проблемы в коде, конечно, могут быть, как описано выше, но команда CommandExec em_everything_exit в секции финализации не работает. В то же время подтверждаю, что ShellExec(COMMANDER_PATH & "\Everything.exe", "-exit") в этой же секции работает.
Вчера у меня не было времени тщательнее попробовать, но сейчас это сделал. Из кнопок все работает:
Код: Выделить всё
RegisterCommand 70503 "ToggleEverything"
RegisterCommand 70504 "TerminateEverything"
Func ToggleEverything()
If Not ProcessExist("Everything.exe") Then
CommandExec em_everything
Else
CommandExec em_everything_exit
Endif
EndFunc
Func TerminateEverything()
CommandExec em_everything_exit
EndFunc
Первая команда запускает или закрывает Everything в зависимости от ее сосотояния, вторая просто закрывает. Можно создать em_команду с кодом 70503 и провесить на комбинацию клавиш. У меня сейчас в usercmd.ini такие команды:
Код: Выделить всё
[em_torrent_data_search]
cmd=70500
[em_torrent_data_everything]
cmd=70501
[em_torrent_data_goto_txt]
cmd=70502
[em_everything]
cmd=%COMMANDER_PATH%\Everything.exe
param=-startup
[em_everything_exit]
cmd=%COMMANDER_PATH%\Everything.exe
param=-exit
[em_everything_toggle]
cmd=70503
Висят на кнопках:
Код: Выделить всё
A+T=em_torrent_data_search
A+E=em_torrent_data_everything
A+P=em_torrent_data_goto_txt
CA+E=em_everything_toggle
Loopback писал(а):А вот насчёт отдельной функции (или пары-тройки), не привязанной к интерфейсам плагинов, подумать можно, это должно быть несложно и никак не затронет интерфейс плагина для обычного пользователя.
Хорошо, но можете не спешить с этим, как я писал. Если найдете время и возможность, было бы неплохо посмотреть, что из этого получится.
P.S. Пока уж залез в конфиг, решил немного пофиксить функцию подсказки. Долго это откладывал, но вчера что-то достала своим неприятным обрывом строки в неподходящем месте. Сейчас вроде все норм. Речь идет о правой боковой:
[cut="hint.txt"]
Name: Titanic (1997) BDRip-HEVC 1080p.mkv
Size: 23.22 GiB
Duration: 11694688
Duration: 3 h 14 min 54 s 688 ms
Duration: 03:14:54.688 (03:14:42:21)
General: 17.1 Mb/s, Matroska, Cover, 23.976 FPS
Video #0: 1920x1080pix, AR:1.778=~16:9, 23.976 (24000/1001) FPS, 9 566 kb/s, 0.192bpf, HEVC, en
Audio #0: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #1: 6ch, 48.0 kHz, 448 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #2: 6ch, 48.0 kHz, 448 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #3: 6ch, 48.0 kHz, 384 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #4: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #5: 6ch, 48.0 kHz, 448 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #6: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #7: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #8: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #9: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #10: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #11: 2ch, 48.0 kHz, 192 kb/s(CBR), AC-3, ru, 31.250 FPS (1536 SPF)
Audio #12: 6ch, 48.0 kHz, 448 kb/s(CBR), AC-3, uk, 31.250 FPS (1536 SPF)
Audio #13: 6ch, 48.0 kHz, 640 kb/s(CBR), AC-3, en, 31.250 FPS (1536 SPF)
Text #0: UTF-8@ru, 243.0 Bytes, 0 b/s, 0.001 FPS
Text #1: UTF-8@ru, 80.27 KiB, 56 b/s, 0.162 FPS
Text #2: UTF-8@ru, 110.8 KiB, 83 b/s, 0.187 FPS
Text #3: UTF-8@uk, 256.0 Bytes, 0 b/s, 0.001 FPS
Text #4: UTF-8@uk, 95.09 KiB, 67 b/s, 0.160 FPS
Text #5: UTF-8@en, 61.37 KiB, 46 b/s, 0.194 FPS
Menu #0: [/cut]
Левая боковая:
[cut="size.txt"]
Name: Titanic (1997) BDRip-HEVC 1080p.mkv
Size: 23.22 GiB
General: 8.86 MiB (0%)
Video #0: 13.0 GiB (56%)
Audio #0: 892 MiB (4%)
Audio #1: 624 MiB (3%)
Audio #2: 624 MiB (3%)
Audio #3: 535 MiB (2%)
Audio #4: 892 MiB (4%)
Audio #5: 624 MiB (3%)
Audio #6: 892 MiB (4%)
Audio #7: 892 MiB (4%)
Audio #8: 892 MiB (4%)
Audio #9: 892 MiB (4%)
Audio #10: 892 MiB (4%)
Audio #11: 268 MiB (1%)
Audio #12: 624 MiB (3%)
Audio #13: 892 MiB (4%)[/cut]
Здесь я приложу только функцию, дополнительная информация и компоненты в этом
посте.
[cut]
Код: Выделить всё
gHintClipboard = false
Func MagicHint(FileName, FieldIndex, UnitIndex)
If StrPos(FileGetAttr(FileName), "D") Then Return ""
Local bCaps = DllCall("GetKeyState", "int", 0x14, "short")
Local b_CTRL = BitAND(bCaps, 1), b_Shift = IsPressed(0x10)
If Not b_CTRL then b_CTRL = IsPressed (0x11)
If Not b_CTRL Then Return
Static sLib
If auX64 Then
sLib = "MediaInfo.dll" # 64-bit
Else
sLib = "MediaInfo_i386.dll" # 32-bit
EndIf
Static Pipe, Idx = 0, bHint = 0, _
sPath = COMMANDER_PATH & "\Ini\Tools\Libs", _
sLang ="file://" & sPath & "ru.csv", _
sHint ="file://" & sPath & "hint.txt", _
sSize ="file://" & sPath & "size.txt", _
hLib = DllCall("LoadLibrary", "Wstr", sPath & sLib, "Ptr"), _
pNew, pOpen, pDel, pOpt, pInfo
If hLib = 0 And FieldIndex > 1 Then Return
If FieldIndex = 1 Then
If hLib = 0 Then Return "Error LoadLibrary " & sLib
Idx = 0
pNew = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_New", "Ptr")
pOpen = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_Open", "Ptr")
pDel = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_Delete", "Ptr")
pOpt = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_Option", "Ptr")
pInfo = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_Inform", "Ptr")
Local hMI = DllCall(pNew, "Ptr")
If hMI = 0 Then Return "MediaInfo.dll couldn't create new object"
If DllCall(pOpen, 'Ptr', hMI, "Wstr", FileName, "Uint") <> 1 Then
DllCall(pDel, "Ptr", hMI)
Return "MediaInfo.dll couldn't open file " & FileName
EndIf
bHint = 0
Local x, y, w
Local hWnd = RequestInfo(ItemAtCursor("panel"))
WinGetPos("", "", "w", "", hWnd)
If w > 0 Then
MouseGetPos("x","y")
Static buf = Buffer(8) # POINT
buf.Zero()
buf.SetNum(0, "long", x, "long", y)
DllCall("ScreenToClient", "hwnd", hWnd, "ptr", buf.ptr)
x = buf.GetNum(0)
Switch Round(x/w*100,0)
Case 0 To 9
b_Shift = 1
Case 10 To 84
# Pipe = ''
# Return
Case 85 To 100
bHint = true
EndSwitch
EndIf
If b_Shift Then
DllCall(pOpt, 'Ptr', hMI, "Wstr", "Complete", "Wstr", "1", "Wstr")
Else
DllCall(pOpt, 'Ptr', hMI, "Wstr", "Complete", "Wstr", "0", "Wstr")
EndIf
If bHint Then
DllCall(pOpt, "Ptr", hMI, "Wstr", "Output", "Wstr", sHint, "Wstr")
ElseIf b_Shift Then
DllCall(pOpt, "Ptr", hMI, "Wstr", "Output", "Wstr", sSize, "Wstr")
Else
DllCall(pOpt, "Ptr", hMI, "Wstr", "Output", "Wstr", "", "Wstr")
EndIf
DllCall(pOpt, 'Ptr', hMI, "Wstr", "Language", "Wstr", (bHint ? "" : sLang), "Wstr")
Pipe = DllCall(pInfo, 'Ptr', hMI, "Uint", 0, "Wstr")
If bHint Then Pipe = StrReplace(Pipe, Chr(32), Chr(160))
DllCall(pOpt, 'Ptr', hMI, "Wstr", "Language", "Wstr", "", "Wstr")
DllCall(pDel, "Ptr", hMI)
If IsPressed(0x5B) Then Idx = 50
If gHintClipboard Then ClipPut(Pipe)
Endif
If bHint Then Return StrPart(Pipe, auCRLF, FieldIndex)
Return FixSpaces(StrPart(Pipe, auCRLF, FieldIndex + Idx))
EndFunc
Func FixSpaces(String)
Local a, b
If Not StrPos(String, ":") Then Return String
a = StrPart(String, ":", 1)
b = StrPart(String, ":", 2) & StrPart(String, ":", 3)
Return StrTrim(a) & ": " & FixCodePage(StrTrim(b))
EndFunc
Func FixCodePage(String)
Local bUsedRepl
# iso-8859-1 = 28591
DllCall("WideCharToMultiByte", _
"uint", 28591, _
"dword", 0, _
"wstr", String, _
"int", -1, _
"ptr", 0, _
"int", 0, _
"ptr", 0, _
"bool*", @bUsedRepl)
If bUsedRepl Then Return String
Local nSize = StrLen(String)
Local buf = Buffer(nSize)
buf.Zero()
DllCall("WideCharToMultiByte", _
"uint", 28591, _
"dword", 0, _
"wstr", String, _
"int", -1, _
"ptr", buf.ptr, _
"int", nSize, _
"ptr", 0, _
"ptr", 0)
Local fixed = buf.GetStr(0, nSize, "ANSI")
Free(buf)
Return fixed
EndFunc
[/cut]
Теперь путь к библиотеке немного проще прописать и добавил переменную gHintClipboard если нужно, чтобы информация в буфер попадала.