Orion9

|
Posted: Fri Apr 17, 2026 00:33 Post subject: |
|
|
| AkulaBig wrote: | | Хотя есть большие сомнения, что это можно использовать из-за того, что ExifTool запускается со стартом ТС. |
Хорошая новость в том, что не надо потом думать, как закрыть процесс при завершении работы ТС. Ключ /TT сам это делает.
Для запуска должен быть, конечно, триггер, запускать ExifTool со стартом ТС не годится. Вам придется придумать такой триггер.
Мне было проще, поскольку я взял за пример свою подсказку ExifTool. Поля подсказки активируются по Alt+F12, соответственно, это и служит триггером. Следующая смена полей (подсказки) позволяеет выгрузить ExifTool по PID, который уже известен.
 Hidden text | Code: | Global gExifPID = 0, gExifStay = 1, gExifOut = TEMP & "\exiftool_out.txt", gExifArgs = TEMP & "\exiftool_args.txt"
Func SetHintFields()
Local i, sHint
Static c = 0, aHints = List("MediaHint", "ExifHint", "JoinHint")
c += 1
If c > 2 Then c = 0
sHint = aHints[c]
For i = 1 to 60
SetFieldsParam("Func", "C" & i, sHint)
Next
ShowRedInfoHint("Поля подсказки " & sHint)
If c = 1 Then
If gExifStay Then
FileWrite(gExifArgs, "", "UTF-8 NOBOM")
ShellExec /TT /SW_HIDE %gMediaExifX32% "-stay_open True -@ ""%gExifArgs%"""
gExifPID = ProcessGetId("exiftool.exe")
If gExifPID = 0 Then MsgBox("Процесс ExifTool не запущен")
EndIf
Else
If gExifPID > 0 Then ProcessTerminate("~/TT",gExifPID)
EndIf
EndFunc
Func ShowRedInfoHint(HintText)
SetHintParam("ShowHint", "Font", 15, "Arial")
SetHintParam("ShowHint", "BackColor", 0xFF0000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint(HintText, 0, 0, 1000, 1)
WinAlign(LAST_HINT_WINDOW)
Sleep(100)
SetHintParam("ShowHint", "Reload")
EndFunc
Func ExifHint(FileName, FieldIndex, UnitIndex)
If FieldIndex > gHintLines Then Return
If StrPos(FileGetAttr(FileName), "D") Then Return
Local bCtrl = BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1)
If Not bCtrl then bCtrl = IsPressed (0x11)
If gHintCaps And Not bCtrl Then Return
If FieldIndex = 1 Then
#ProcessExecGetOutput /C:65001 gHintPipe %gMediaExifX32% ' -G -S -lang ru "%FileName%"'
gHintPipe = GetExifInfo(FileName)
Endif
Return StrPart(gHintPipe, auLF, FieldIndex)
EndFunc
Func GetExifInfo(FileName)
Static a = List(), u = List()
Local ansi, utf8, wrong = Chr(0xFFFD)
If Not gExifStay Then
ProcessExecGetOutput ansi %gMediaExifX32% ' -charset filename=utf8 -G -S -lang ru "%FileName%"'
Else
If FileExist(gExifOut) Then
ShellExec /SW_HIDE %COMSPEC% '/c del /f /q "%gExifOut%"'
EndIf
Local sArgs = "-W+!" & auCRLF & gExifOut & auCRLF & FileName & auCRLF & "-execute" & auCRLF
Local obj = BinaryFile(gExifArgs, "a")
obj.WriteStr(sArgs, "", "UTF-8")
Free(obj)
ansi = "<time-out>"
For i = 1 To 50
If FileExist(gExifOut) Then
ansi = FileRead(gExifOut)
ShellExec /SW_HIDE %COMSPEC% '/c del /f /q "%gExifOut%"'
Break
EndIf
Sleep(20) # time-out
Next
EndIf
Local nSize = StrLen(ansi)
Local buf = Buffer(nSize)
buf.Zero()
buf.SetStr(ansi, 0, nSize, "ANSI")
utf8 = buf.GetStr(0, nSize, "CP:65001")
Free(buf)
a.Count = 0
u.Count = 0
a.Text = ansi
u.Text = utf8
For i = 0 to u.Count - 1
If StrPos(u[i], wrong) Then u[i] = a[i]
Next
Return u.text
EndFunc
ReadWdxHintCfg()
Func ReadWdxHintCfg()
gHintWdxList.Count = 0
gHintWdxList.LoadFromFile(gHintWdxCfg)
EndFunc
Func MediaHintWDX(WdxName, Filename)
If Not FileExist(Filename) Then
Return auCRLF & auCRLF & "Файл не существует " & Filename
Endif
Local obj = Plugin(WdxName)
If ERROR <> 0 Then
Return auCRLF & auCRLF & "Autorun: " & WdxName & " plugin error " & ERROR
EndIf
Local i, txt, data
obj.FileName = Filename
For i = 0 To obj.FieldCount -1
data = obj.GetValue(i)
If data = "" Then Continue
txt &= obj.FieldName(i) & ": " & data & auCRLF
Next
Free(obj)
txt = StrTrim(txt)
If StrLen(txt) > 0 Then txt = auCRLF & auCRLF & txt
Return txt
EndFunc
Func MediaHintType()
# переключение переменной
gHintWdx = Not gHintWdx
ShowRedInfoHint("WdxHint.cfg " & (gHintWdx ? "включен" : "выключен"))
EndFunc |
Код из модуля MediaInfo.aucfg, это самая его концовка. Можно подключить к модулю из сборки и проверить его работу. Но можно, конечно, не подключать, а просто посмотреть алгоритм и реализацию.
Скорость, конечно, взлетела. Не обманул болван Я проверял на 10 полях из 60 возможных (те самые C1-C60), работает очень быстро.
Сейчас нет возможности расписать все в деталях, но может быть вам это и не нужно. Оставлю только поля для колонок, чтобы вручную их не делать самостоятельно
| Code: | Widths32=80,30,30,30,30,30,30,30,30,30,30,30,30
Headers32=C1\nC2\nC3\nC4\nC5\nC6\nC7\nC8\nC9\nC10\nC11
Contents32=[=autorun.C1]\n[=autorun.C2]\n[=autorun.C3]\n[=autorun.C4]\n[=autorun.C5]\n[=autorun.C6]\n[=autorun.C7]\n[=autorun.C8]\n[=autorun.C9]\n[=autorun.C10]\n[=autorun.C11]
Options32=-1|0|96 |
|
|